我想更新嵌套属性但是失败了,例如有一篇文章,一本书有很多评论。当我发现我写的评论有一些错误时,我想修改它。 这是我的代码。
在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。我该怎么做才能改变我的代码。
答案 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
语句来反思代码的实际行为。