RoR博客平台评论系统

时间:2011-05-09 02:36:28

标签: ruby-on-rails belongs-to commenting

我正在尝试为我的RoR博客网站设计一个评论系统,我对这个架构有一些概念上的问题。就模型而言,我有Blogposts,Users和Comments。

  • 用户 has_many Blogposts
  • Blogpost 属于一个用户
  • Blogpost has_many 评论
  • 评论 可能是也可能不属于已注册的用户(我希望未在该网站注册的人能够评论为好)。

我的问题是:为了强制执行评论和博客帖子之间的链接,我通过博客帖子关联( @ blogpost.comments)创建每个新评论( @comment )。构建(适用:参数))。但是,我不知道如何将特定注册用户与他/她的评论相关联。我为评论模型留下 user_id 属性 attr_accessible ,因为我想防止人们将评论归因于错误的用户。

关于如何最好地实现具有这种关系的评论系统的任何想法?非常感谢提前!

4 个答案:

答案 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插件:)

https://github.com/jackdempsey/acts_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

Above code from the Authlogic quick example

答案 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用户就应该顺利通过。