2011-02-18 40 views
0

嘿,大家我有一个场景,我真的想弄明白。我正在尝试在Rails中构建一个自定义博客,要求用户登录才能发表评论。基本上我有3个模型 - 发布,用户和评论。我的问题主要是评论模型。 我想让它有一个评论belongs_to一个用户,也belongs_to邮政,这有很多意见。我也让post_id和user_id无法访问,因为我不希望它们被篡改(我希望评论能够自动与其留下的帖子的ID相关联,并且我希望用户能够自动确定通过会话)。我的问题是我不确定如何创建有效的评论。如果我尝试添加@ blog.comments.build(@attr)的评论,我忽略了无法访问的用户,当然如果我尝试通过用户来构建它,我会忽略博客。有两个外键的Rails Activerecord模型,既不可访问,也不可访问

我的猜测是有一个更好的方法来做到这一点,我可能会错误地接近它。有任何想法吗?

+0

by @blog你的意思是@post? – jakeonrails 2011-02-18 20:29:08

回答

1

我相信你有这个在Comment模型:

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。

1

你总是可以只手动设置的关系:

comment = @post.build(@attr) 
comment.user = @user 
comment.save 

至少,我敢肯定,将工作。

+0

我试过这个,但得到了一个未定义的方法异常。我也期待这一点,因为在模型中我只有'attr_accessible:content'而不是user_id或类似的东西。由于用户必须登录才能发表评论我希望能够包含一个会话帮助器,并且在评论模型中只需要一个beforesave方法执行类似'self.user_id = current_user'之类的操作。有什么想法吗? – 2011-02-18 20:48:06

+0

作为一个附注,如果我在你的方法工作的模型的attr_accessible部分包含user_id。但正如我所说,我最好只喜欢通过会话设置user_id而不是通过post传递用户变量,因为imo似乎不太可能被篡改 – 2011-02-18 20:51:09