Ruby 为什么赢了';当我将数据映射器记录传递给它所属的用户时,它是否保存?
我已经使用DataMapper和Sinatra建立了一个简单的、有很多和属于的关联。我的用户模型有许多“Peep”,我的Peep模型属于用户。请参见下面的课程 通过在初始化时将用户id直接传递到peep中,我能够成功创建属于特定用户的新peep,如下所示: 方法1Ruby 为什么赢了';当我将数据映射器记录传递给它所属的用户时,它是否保存?,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
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);结束
。属于
方法基本上是用来帮助编写更少的代码的。