通过表单 [Rails 5] 提交嵌套资源时遇到问题



我有一个Documenthas_manySection,每个sectionhas_oneComment。我希望能够在Documentshow视图中同时创建sectionscomments,但是我无法通过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 %>

这一切似乎都为我检查出来了,但是当我尝试发表评论时,这就是我得到的:

Started POST "/sections/51/comments" for ::1 at 2019-05-24 23:29:06 +0000
Processing by CommentsController#create as JS
Parameters: {"utf8"=>"✓", "authenticity_token"=>[...], "comment"=>{"body"=>"asdas"}, "commit"=>"Save comment", "section_id"=>"51"}
Section Load (0.5ms)  SELECT  "sections".* FROM "sections" WHERE "sections"."id" = ? LIMIT ?  [["id", 51], ["LIMIT", 1]]
comment Load (0.4ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."section_id" = ? LIMIT ?  [["section_id", 51], ["LIMIT", 1]]
Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.9ms)
NoMethodError (undefined method `create' for nil:NilClass):
app/controllers/comments_controller.rb:4:in `create'

有什么想法吗?

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

或者,如轨道指南中所述...

初始化新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

您可能需要更改:

@section.comment.create(comment_params)

自:

@section.comments.create(comment_params)

如果这不起作用,请尝试:

@section.comment.create!(comment_params)

看看异常怎么说

最新更新