comments_to Post和belongs_to User的评论

时间:2012-04-05 22:36:18

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我正在尝试为帖子模型添加评论

class Comment < ActiveRecord::Base
    belongs_to :post
    belongs_to :user #should this be has_one :user instead?
....

如何设置我的评论新操作和创建操作以同时获取current_user和当前帖子?

guides.rubyonrails.org建议

控制器:

def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
end

查看

<%= form_for([@post, @post.comments.build]) do |f| %>
...

然而,这似乎只是旨在与帖子相关联而不是用户。如何设置两个关联?

2 个答案:

答案 0 :(得分:6)

我假设您的控制器中有某个current_user()方法。

所以这应该这样做:

def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.build(params[:comment])
    @comment.user = current_user
    @comment.save
    redirect_to post_path(@post)
end

答案 1 :(得分:0)

Deradon很好地回答了这个问题,但我更倾向于在新的评论表中加入这种逻辑。例如,您可以拥有以下内容而不是调用这些变量:

应用程序/视图/评论/ _form.html.erb:

<%= f.hidden_field :user_id, value: current_user.id %>
<%= f.hidden_field :post_id, value: @post.id %>

这当然假设您的新评论表格嵌入在“展示后”页面中,以便@post可用:

应用程序/视图/帖/ show.html.erb:

<body>
  <%= render @post %>
  <%= render 'comments/_form' %>
</body>

这会将post_id和user_id直接添加到数据库中以获取新注释。另外,不要忘记为这些外键创建索引,以便数据库具有更快的访问权限。如果你不知道如何,谷歌吧!