如何更新表单中的嵌套属性

时间:2017-04-22 07:40:21

标签: ruby-on-rails ruby

我想更新嵌套属性但是失败了,例如有一篇文章,一本书有很多评论。当我发现我写的评论有一些错误时,我想修改它。 这是我的代码。

code_snippet.rb

class CodeSnippet < ApplicationRecord
  has_many :annotations, dependent: :destroy
  accepts_nested_attributes_for :annotations ,update_only: true ,reject_if: :all_blank, allow_destroy: true
end

annotation.rb

class Annotation < ApplicationRecord
  belongs_to :code_snippet

end

code_snippet_controller.rb

  def edit
    @code_snippet = CodeSnippet.find(params[:id])
  end

  def update
    @code_snippet = CodeSnippet.find(params[:id])
    if @code_snippet.update(code_snippet_params)
      redirect_to @code_snippet
    else
      render 'edit'
    end
  end

 private
    def code_snippet_params
      params.require(:code_snippet).permit(:snippet)
    end

annotation.rb

  def edit
    @code_snippet = CodeSnippet.find(params[:code_snippet_id])
    @annotation = @code_snippet.annotations.find(params[:id])
  end
  def update
    @code_snippet = CodeSnippet.find(params[:id])
    @annotation = @code_snippet.annotations.find(params[:id])
    if @annotation.update(annotation_params)
      redirect_to @code_snippet
    else
      render 'edit'
    end
  end

在&views; / code_snippets / show.html.rb&#39;

<div>
    <h2>Annotations</h2>
<%= render @code_snippet.annotations %>
</div>

在&views; / annotations / _annotation.html.erb&#39;

<p>
  <strong>User:</strong>
  <%= annotation.user %>
</p>
<p>
  <strong>Line:</strong>
  <%= annotation.line %>
</p>
<p>
  <strong>Body:</strong>
  <%= annotation.body %>
</p>

<p>

  <%= link_to "Edit", edit_code_snippet_annotation_path(annotation.code_snippet,annotation) ,controller: 'annotation'%>
</p>

在&views; / annotations / edit.html.erb&#39;:

<%= form_for(@code_snippet) do |f| %>


    <%= f.fields_for :annotation,method: :patch do |builder| %>

        <p>
          <%= builder.label :user %><br>
          <%= builder.text_field :user %>
        </p>

        <p>
          <%= builder.label :line %><br>
          <%= builder.text_field :line %>
        </p>

        <p>
          <%= builder.label :body %><br>
          <%= builder.text_area :body %>
        </p>

        <p>
          <%= builder.submit %>
        </p>
    <% end %>
<% end %>

我想更新注释而不更改codesnippets。我该怎么做才能改变我的代码。

1 个答案:

答案 0 :(得分:0)

所以....这里有很多事情发生,所以我要建议仔细看看docs

首先,让我们看看你的表格: CodeSnippet has_many:annotations

所以你的fields_for语句应该是:annotations,而不是:annotation。语句的字段也不应该采用方法选项键。

接下来你的code_snippets_controller: 如文档所示,从嵌套属性表单发回的参数将位于键annotations_attributes下,并将包含数组哈希值。

您需要允许此属性以及您希望使用强参数传递到注释模型的任何属性:

params.require(:code_snippet).permit(annotations_params: [:some, : permitted, :params])

我相信这就是让你的榜样工作所需要的一切。但是,如果您遇到更多麻烦,我建议花一些时间和一些binding.pry语句来反思代码的实际行为。