Ruby on Rails - 嵌套关联 - 创建新记录

时间:2015-03-16 21:09:52

标签: ruby-on-rails ruby-on-rails-4 has-many-through

我正在学习Rails(已安装4.2)并正在使用社交网络模拟应用程序。 我已经在用户和帖子之间设置了一对多的关系,现在我正在尝试将评论添加到帖子中。经过多次尝试并在documentation on rubyonrails.org之后,我最终得到了以下设置:

用户模型

  has_many :posts, dependent: :destroy
  has_many :comments, through: :posts

发布模型

  belongs_to :user
  has_many :comments

评论模型

  belongs_to :user

评论是从帖子显示页面开始的,所以 帖子控制器有:

def show
    @comment = Comment.new
  end

现在的问题是:在评论控制器中,创建新记录的正确方法是什么。 我尝试了下面和其他许多,但没有成功。

def create

    @comment = current_user.posts.comment.new(comment_params)
    @comment.save

    redirect_to users_path

  end

(current_user来自Devise)

此外,之后,如何选择与评论相对应的帖子?

谢谢

2 个答案:

答案 0 :(得分:0)

您需要在Post上创建关系,让每个Comment知道“它与Post相关联”。在您的情况下,您可能希望在Comment上为post_id创建外键,然后每个Commentbelong_to为特定Post。因此,您需要在belongs_to :post型号上添加Comment

所以,你的模型变成了:

class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  has_many :comments, through: :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end

class Comments < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

然后,要创建Comment,您需要在控制器中执行以下两项操作之一:

  1. 通过URI加载与您正在创建的Post对应的Comment作为参数。

  2. Post上调用create方法的表单中传递Comment ID。

  3. 我个人更喜欢从URI中的参数加载Post,因为只要授权可以将Comment添加到{{1 - 例如想到有人黑客攻击表单并更改表单最初设置的Post的ID。

    然后,Post中的create方法看起来像这样:

    CommentsController

答案 1 :(得分:0)

将您的Comment模型更改为:

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user, through: :post
end

从视图模板中传递post_id

<%= hidden_field_tag 'post_id', @post.id %>

然后更改您的create操作:

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