Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么赢了';当我将数据映射器记录传递给它所属的用户时,它是否保存?_Ruby_Sinatra_Datamapper - Fatal编程技术网

Ruby 为什么赢了';当我将数据映射器记录传递给它所属的用户时,它是否保存?

Ruby 为什么赢了';当我将数据映射器记录传递给它所属的用户时,它是否保存?,ruby,sinatra,datamapper,Ruby,Sinatra,Datamapper,我已经使用DataMapper和Sinatra建立了一个简单的、有很多和属于的关联。我的用户模型有许多“Peep”,我的Peep模型属于用户。请参见下面的课程 通过在初始化时将用户id直接传递到peep中,我能够成功创建属于特定用户的新peep,如下所示: 方法1 new\u peep=peep.create(内容:params[:content],用户标识:current\u user.id) 这将Peep与Peep.count相加1 但是,我的理解是,我应该能够通过将当前_用户分配给新的_p

我已经使用DataMapper和Sinatra建立了一个简单的、有很多和属于的关联。我的用户模型有许多“Peep”,我的Peep模型属于用户。请参见下面的课程

通过在初始化时将用户id直接传递到peep中,我能够成功创建属于特定用户的新peep,如下所示:

方法1

new\u peep=peep.create(内容:params[:content],用户标识:current\u user.id)

这将Peep与Peep.count相加1

但是,我的理解是,我应该能够通过将当前_用户分配给新的_peep.user来创建关联。但是当我尝试这样做时,peep对象不会保存

我试过这个:

方法2

new\u peep=peep.create(内容:params[:content],用户:当前用户)

此处的当前用户是user.get(会话[:当前用户\u id])

生成的新\u-peep的id为nil,但将user\u-id设置为当前\u用户的id。新\u-peep与使用方法1成功创建的新\u-peep完全相同,只是它没有id,因为它没有成功保存。我尝试分别调用new_peep.save,但我仍然得到以下peep对象:

,@errors={}

请注意,没有验证错误。其他人在保存记录时遇到的大多数问题都归结为未满足验证标准

我认为这与“属于”关联不起作用有关,但我仍然可以(在使用上述方法1创建新的\u peep后)调用new\u peep.user并访问正确的用户。因此,在我看来,你所属的是一个读者,而不是一个制定者

这个问题还意味着我不能通过在user.peeps集合中添加一个peep然后保存user来创建一个peep,这意味着属于user的peep实际上没有任何意义

我见过其他人在保存没有任何更改的记录时遇到问题,但这是一个全新的记录,所以它的所有属性都在更新

我真的很想知道发生了什么-这让我困惑太久了

以下是我的课程:

class Peep

    include DataMapper::Resource

    property :id, Serial
    property :content, Text
    property :created_at, DateTime

    belongs_to :user, required: false

    def created_at_formatted
        created_at.strftime("%H:%M, %A %-d %b %Y")
    end

end


class User

    include DataMapper::Resource
    include BCrypt

    attr_accessor :password_confirmation
    attr_reader :password

    property :id, Serial
    property :email, String, unique: true, required: true
    property :username, String, unique: true, required: true
    property :name, String
    property :password_hash, Text

    def self.authenticate(params)
        user = first(email: params[:email])
        if user && Password.new(user.password_hash) == params[:password]
            user
        else
            false
        end
    end

    def password=(actual_password)
        @password = actual_password
        self.password_hash = Password.create(actual_password)
    end

    validates_confirmation_of :password
    validates_presence_of :password

    has n, :peeps

end

当您创建Peep时,您不会通过User创建它,这可能就是它没有主id的原因,因为它属于User。此外,您还将外键
user\u id
分配给它,就好像您有这样定义的属性一样。虽然数据库有它,但在DataMapper中,您不需要传递外键id,它会为您传递外键id

试着替换

new_peep = Peep.create(content: params[:content], user: current_user)
与:

new_peep = current_user.peeps.create(content: params[:content], created_at: Time.now)

当您创建Peep时,您不会通过User创建它,这可能就是它没有主id的原因,因为它属于User。此外,您还将外键
user\u id
分配给它,就好像您有这样定义的属性一样。虽然数据库有它,但在DataMapper中,您不需要传递外键id,它会为您传递外键id

试着替换

new_peep = Peep.create(content: params[:content], user: current_user)
与:

new_peep = current_user.peeps.create(content: params[:content], created_at: Time.now)

你试过打电话给valid吗?在读取错误之前记录?在rails中,这是加载刚刚尝试的错误ArrayTanks Max所必需的。有效吗?对于记录返回true,错误集合仍然为空。是否可以链接到回购或发布完整脚本来测试它?我不认为你的断言“实际上,peep中没有属于用户的点”是正确的。对于
user\u id:current\u user.id
,我看
user:current\u user
的语法没有sugar那么多。
属于:用户
关联基本上是
def用户的糖;User.find_by(id:self.User_id);结束
属于\u to
方法基本上可以帮助编写更少的代码。您是否尝试调用valid?在读取错误之前记录?在rails中,这是加载刚刚尝试的错误ArrayTanks Max所必需的。有效吗?对于记录返回true,错误集合仍然为空。是否可以链接到回购或发布完整脚本来测试它?我不认为你的断言“实际上,peep中没有属于用户的点”是正确的。对于
user\u id:current\u user.id
,我看
user:current\u user
的语法没有sugar那么多。
属于:用户
关联基本上是
def用户的糖;User.find_by(id:self.User_id);结束
属于
方法基本上是用来帮助编写更少的代码的。