Rails始终在Recipe-Ingredient Relationship中添加嵌套表单

时间:2016-04-11 23:25:19

标签: ruby-on-rails ruby

目前我有两个模型,Recipe和Ingredient,它们通过has_many belongs_to关系链接。

在我的食谱表单视图中,我有以下代码:

<%= f.simple_fields_for :ingredients do |ingredient| %>
    <%= render 'ingredient_fields', f: ingredient %>
  <% end %>
  <div class="links">
    <%= link_to_add_association 'Add Ingredient', f, :ingredients, class: "btn btn-default add-button" %>

和_ingredient_fields.html.erb

.form-inline.clearfix
.nested-fields
= f.input :name, input_html: {class: "form-input form-control"}
= f.input :quantity, input_html: {class: "form-input form-control"}
= link_to_remove_association 'Remove', f, class: "form-button btn btn-default"

然而,每当我尝试编辑配方时,它会自动重新添加所有成分。例如,如果食谱被称为&#34; Arnold Palmer&#34;成分是柠檬水和冰茶,它会显示每种成分一次。但是,只要我输入&#34;编辑&#34;看来,即使我没有改变任何东西,当我回到视图时,它会两次列出柠檬水和冰茶两次。如何在编辑视图中阻止它读取成分?

参考显示代码:

<ul>
<% @recipe.ingredients.each do |x| %>
<li><%= (x.quantity * @recipe.rating) %> oz <%= x.name  %> </li>
<% end %>
</ul>

编辑:添加:id参数后的控制器。它不再添加重复成分,但我仍然无法去除成分。

def recipe_params 
  params.require(:recipe).permit(:name, :rating, :visible, :instructions, :description, :abv, ingredients_attributes: [ :id, :name, :quantity ])
end

1 个答案:

答案 0 :(得分:0)

你可以发布你的控制器吗,我认为你没有将ingredient.id添加到你的强参数中。

如果你没有将id添加到强参数白名单中,Rails会认为你想添加新的成分而不是更新现有成分。

你应该有类似的东西,请注意:id参数

def recipe_params
    params.require(:recipe).permit(ingredients_attributes: [:id, :name])
end