无法通过表单提交嵌套资源[Rails 5]

时间:2019-05-24 23:33:53

标签: ruby-on-rails forms ruby-on-rails-5 nested-resources

我有一个Document has_many的{​​{1}},每个Section section has_one。我希望能够在Comment sections视图中同时创建commentsDocument,但是我很难通过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 %>

有什么想法吗?

2 个答案:

答案 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)

看看异常怎么说