我有一个Document
has_many
的{{1}},每个Section
section
has_one
。我希望能够在Comment
sections
视图中同时创建comments
和Document
,但是我很难通过show
。 / p>
以下是与我最接近的相关代码:
comments
路由:
class CommentsController < ApplicationController
def create
@section = Section.find(params[:id])
@section.comment.create(comment_params)
end
private
def comment_params
params.require(:comment).permit(:body)
end
end
视图的形式为:
resources :documents, shallow: true do
resources :sections do
resources :comments
end
end
一切似乎都为我结帐,但是当我尝试发表评论时,这就是我得到的:
# app/views/documents/show.html.erb
<% @document.sections.each do |section| %>
<%= section.body %>
<% if section.comment %>
<p>
<%= section.comment %>
</p>
<% else %>
<%= form_with url: section_comments_path(section.id), scope: 'comment' do |form| %>
<%= form.text_field :body, placeholder: "Comment" %>
<%= form.submit %>
<% end %>
<% end %>
<% end %>
有什么想法吗?
答案 0 :(得分:2)
has_one
关系返回对象本身。因此,@section.comment.create(comment_params)
将不起作用,因为@section.comment
为零。相反,尝试类似...
def create
@section = Section.find(params[:section_id])
@comment = Comment.create(comment_params)
@section.comment = @comment
...
end
或者,如《 Rails指南》中所述...
初始化新的has_one或belongs_to关联时,必须使用 build_前缀来建立关联,而不是 用于has_many的association.build方法或 has_and_belongs_to_many关联。要创建一个,请使用create_ 前缀。
看起来像这样
def create
@section = Section.find(params[:section_id])
@section.create_comment(comment_params)
...
end
答案 1 :(得分:0)
您可能需要更改:
@section.comment.create(comment_params)
收件人:
@section.comments.create(comment_params)
如果这不起作用,请尝试:
@section.comment.create!(comment_params)
看看异常怎么说