Rails:无法在创建期间为对象belongs_to设置id

时间:2014-08-14 17:24:55

标签: ruby-on-rails

我有以下型号,但我无法在创建时设置comment.post_id。

Post.rb
  has_many :comments

Comment.rb
  belongs_to :post

情况A(首选):

新评论的表单位于展后页面。 因此帖子#show应该以:

结束
@comment = comment.new
@comment.post_id = params[:id]

和posts / show.html.erb应该包含:

<%= render 'comments/form' %>

但是,该表单会引发Post can't be blank错误。

情况B:

我试过的第二件事是没有用的,是:

帖子页面链接到新评论的页面,并将post_id存储在URL中。

config / routes.rb包括:

get 'posts/:id/comment', to: 'comments#new', as: 'new_comment'

链接的格式如下:

<%= link_to "New comment", new_comment_path(@post) %>

评论#new包含

@review = Review.new
@review.player_id = params[:id]

这也不起作用,表单返回Post can't be blank

情况C

与B相同,但post_id存储在cookie中,如此... 帖子#show includes:

@comment = Comment.new
session[:post_id] = params[:id]

posts / show.html.erb包含以下链接:

<%= link_to "new comment", new_comment_path %>

和评论#new是:

@review = Review.new
@review.player_id = session[:player_id]
session.delete(:player_id)

我原本以为问题是comment_params方法,但看起来很好:

params.require(:comment).permit(:body, :post_id)

那么如何分配comment.post_id?

2 个答案:

答案 0 :(得分:1)

因为comment belongs_to :post,你需要处理Post,而不是post_id。所以:

@post = Post.find(params[:post_id])
@comment = @post.comments.new
etc

根据您发布的内容,我不清楚该帖子的ID是params[:id]还是params[:post_id],但我认为您明白了这一点。< / p>

答案 1 :(得分:0)

问题是,在提交表单后,表单只会发回它所拥有的任何字段。因此,即使分配了post_id,注释#create action也不会收到值。

解决方案是在表单中创建一个隐藏字段,如下所示:

<%= form.text_field :post_id, :hidden => true %>