2017-04-22 48 views
0

我想更新嵌套的屬性但失敗,例如有一篇文章,並且一本書有很多評論。當我發現我寫的評論有一些錯誤,所以我想修改它。 這是我的代碼。如何更新表格中的嵌套屬性

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 

在 '視圖/ code_snippets/show.html.rb'

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

在 '視圖/註解/ _annotation.html.erb'

<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> 

在「視圖/註解/編輯。 html.erb':

<%= 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。我應該怎麼做來改變我的代碼。

回答

0

所以....還有很多事情在這裏,所以我會通過建議在docs

首先仔細一看開始,讓我們看看你的形式: CodeSnippet的has_many:註釋

所以你的fields_for語句應該用於:註釋,而不是:註釋。語句的字段也不應該採用方法選項鍵。

接下來您的code_snippets_controller: 如文檔所示,從嵌套屬性表單發回的參數將在關鍵字annotations_attributes之下,並且將包含數組散列。

你需要讓這個屬性,你要傳遞到註釋模型具有很強的參數任何屬性:

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

我相信這是所有你需要得到你的榜樣工作。但是,如果遇到更多麻煩,我建議花幾個binding.pry陳述來反省代碼的實際行爲。

+0

它不起作用,如果我改變了field_for的註釋,它會顯示codesnippet的所有註釋,我只是想修改其中的一個。我有做這個添加在code_snippet_params annotations_params: ''' 私人 高清code_snippet_params params.require(:CODE_SNIPPET).permit(:片斷,annotations_params::用戶:行:正文]) 結束 ''' – AlexKIe