嘿大家我在这里有一个场景我真的想弄清楚。我正在尝试在Rails中构建一个自定义博客,要求用户登录以发表评论。基本上我有3个模型 - 帖子,用户和评论。我的问题主要是评论模型。 我试图让它成为一个评论属于一个用户,也属于发布,它有很多评论。我也使post_id和user_id无法访问,因为我不希望它们被篡改(我希望评论自动与其留下的帖子的ID相关联,我希望用户自动确定通过会议)。我的问题是我不确定如何创建有效的评论。如果我尝试添加评论@ blog.comments.build(@attr)我忽略了无法使用的用户,当然如果我尝试通过用户构建它我忽略了博客。
我的猜测是有一个更好的方法来做到这一点,我可能只是接近它错了。有什么想法吗?
答案 0 :(得分:1)
您可以随时手动设置关系:
comment = @post.build(@attr)
comment.user = @user
comment.save
至少,我很确定这会奏效。
答案 1 :(得分:1)
我假设你在评论模型中有这个:
attr_accessible :content
当你尝试建立评论时会发生这种情况:
@post = Post.first
@post.comments.build(:user=>current_user)
# => WARNING: Can't mass-assign protected attributes: user
这样就行不通了。
如果您想保护user_id和post_id不被更新覆盖,您可以这样做:
attr_accessible :content, :user_id, :post_id
attr_readonly :user_id, :post_id
@post = Post.first
@post.comments.build(:user=>current_user)
@post.save!
# sets user_id when creating
@post.user_id = 37
@post.save!
# saves, but user_id is not changed. No warning is logged.
@post.update_attributes(:user_id=>37)
# same as above
@post.update_attribute(:user_id,37)
# raises ActiveRecord::ActiveRecordError: user_id is marked as readonly
但这似乎有些过分,因为大概你的应用程序不会为现有评论提交带有user_id的表单,而且有人必须编写自己的表单并将其发布以更改ID。