Ruby on Rails:如何保存依赖于其他两个模型的模型?

时间:2013-02-20 17:29:58

标签: ruby-on-rails ruby

我是Ruby on Rails的新手。我已经设置了一个基本的用户/帖子模型,允许用户创建帖子。我正在尝试为帖子创建评论,这也会将评论与创建评论的用户联系起来。

我已经设置了关系,以便用户拥有许多帖子和评论,帖子属于用户并且有很多评论,评论属于帖子和用户。

我在试图保存评论时出现问题。在我的评论控制器中:

def create
    @comment = current_user.comments.build(params[:comment])
end

这不起作用,并且没有说明评论的哪个帖子属于。我还在显示帖子页面上显示“添加评论”表单,以便在帖子下方创建评论墙,但我的表单仍然只是说

<%= form_for @comment do |f| %>

并且不会将评论与“显示”下的帖子控制器中的帖子相关联。

我意识到可能有一个简单的答案,但找不到任何解释我具体问题的资源。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

我会说你主要是将评论添加到特定帖子。所以从那里开始:

def create
  @post = Post.find(params[:post_id])  # <== this may be just `id`
  @comment = @post.comments.build(params[:comment])
  @comment.user = current_user

  if @comment.save
    # ... do things
  else
    # ..  render error
  end
end

为此,您需要嵌套路线:

resources :posts do
  resources :comments
end

您的form_for需要指明嵌套路线:

<%= form_for [@post, @comment] %>

答案 1 :(得分:1)

你在CommentsController #create

中做了正确的事
@comment = current_user.comments.build(params[:comment])

您缺少的部分包括params [:comment]中的post_id。这应该没问题,因为你总是知道你正在评论的帖子,你正在展示的那个。因此,在form_for @comment

中添加以下内容
<%= f.hidden_field :post_id, @post.id %>

我假设这是在你的show post视图中,你已经在你的PostController#show

中设置了@post

答案 2 :(得分:0)

你可以这样做:

def create
  @comment = Comment.new(params[:comment])
  @comment.user = current_user
  if @comment.save ...