Rails fields_for更新不起作用(删除父对象)

时间:2015-03-11 18:45:17

标签: ruby-on-rails ruby ruby-on-rails-4 form-for fields-for

我有fields_for表单用于更新,如下所示:

  <%= form_for @cuisine, url: {action: "update" } do |f| %>
    <%= f.text_area :name %>

    <% @cuisine.ingredients.each do |ing| %>     
      <%= f.fields_for ing do |ingredient_fields|%>
        <%= ingredient_fields.text_area :name, :value=> ing.name %>
        <%= ingredient_fields.hidden_field :_destroy%>
        <%= link_to_remove_fields 'Remove this ingredient', f %>
      <% end %>
    <% end %>

  <% end %>

my cuisines_controller:

def update
  @cuisine = Cuisine.find(params[:id])
  if @cuisine.update_attributes(cuisine_params)
     redirect_to root_path
  else
     redirect_to edit_cuisine_path
  end
end

虽然这样可以正确显示表单(显示填充了@cuisine及其成分&#39; info的表单),但在重新加载页面后,@ cuisine对象会被删除,即使我没有按下提交按钮。

知道发生了什么或如何使用fields_for更新嵌套属性?

提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,您应该像这样使用fields_for

<%= f.fields_for :ingredients do |ingredient_fields|%>
  <%= ingredient_fields.text_area :name %>
  <%= ingredient_fields.hidden_field :_destroy %>
  <%= link_to_remove_fields 'Remove this ingredient', f %>
<% end %>

其次,首先应检查控制器cuisine_params中的permit是否属于这些属性:

params.require(:cuisine).permit(:name, ingredients_attributes:[:id, :name, :_destroy])

最后,请确保您的模型具有此accepts_nested_attributes_for :ingredients, allow_destroy: true