我正在尝试为我的RoR博客网站设计一个评论系统,我对这个架构有一些概念上的问题。就模型而言,我有Blogposts,Users和Comments。
我的问题是:为了强制执行评论和博客帖子之间的链接,我通过博客帖子关联( @ blogpost.comments)创建每个新评论( @comment )。构建(适用:参数))。但是,我不知道如何将特定注册用户与他/她的评论相关联。我为评论模型留下 user_id 属性 attr_accessible ,因为我想防止人们将评论归因于错误的用户。
关于如何最好地实现具有这种关系的评论系统的任何想法?非常感谢提前!
答案 0 :(得分:1)
假设:
User has_many comments
Comment belongs_to user
保存评论时在控制器中,您可以执行以下操作:
@comment.user = current_user if current_user
@comment.save
如果评论由未注册的用户@comment.user
完成,则保持为空。
答案 1 :(得分:1)
你可以有一个关联:
User has_many comments through blog_posts
所以,现在你可以做到:
current_user.comments
另一种方法是通过blog_post:
current_user.blog_post.comments
此外,你可以使用漂亮的act_as_commentable插件:)
答案 2 :(得分:0)
如果您可以在保存或发布新评论方法中访问当前登录的用户,则无需将 user_id 设置为 attr_accessible 。
如果他们没有登录,那么您希望当前用户为空/假。
如果您使用任何身份验证插件(如authlogic或devise),则应该可以使用此选项。根据我使用authlogic的经验,您通常在ApplicationController中有一个current_user方法。
class ApplicationController
helper_method :current_user_session, :current_user
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.user
end
end
答案 3 :(得分:0)
您可以在Comment和User之间添加关联,然后使用current_user创建注释:
# User.rb
has_many :comments
# Comment
belongs_to :user
设置关联只会真正添加关联方法,因此在没有登录用户的情况下创建Comment没有问题。您不希望将current_user的注释构建为current_user.comments.create(...)
,因为如果没有人登录,则会抛出NilClass错误。
@user = current_user # @user should be nil if commenter is not logged in
# be fancy and use a block
@blogpost.comments.create(params[:comment]) do |c|
c.user = @user
end
只要在评论中没有对用户进行验证,nil用户就应该顺利通过。