包含 check_box_tag 的表单 -- 参数不更新具有多次通过关系
Form including check_box_tag -- params not updating a has-many-through relationship
我正在尝试实现一个 check_box_tag 来储存带有成分的冰箱模型对象;这两个模型通过具有多次关联的关系(FridgeIngredient 模型)链接在一起。值得注意的是,每个 Fridge 也属于一个用户,我担心这可能会以某种方式引起这里的问题(因为这是我从这段代码之前为我工作的地方可以看到的唯一区别)。
我之前已经成功地为一个多次通过的关系建立了一个复选框列表,虽然它在这个场合不起作用。以下表单代码(适用于这些模型)在其他地方有效,但现在无法更新冰箱:
<%= form_for(@fridge) do |f| %>
<!-- a debug column for testing -->
<%= f.label :debug %>
<%= f.text_field :debug
<!-- the checkboxes -->
<h2>Add ingredients to your Fridge</h2>
<div>
<% hidden_field_tag "fridge[ingredient_ids][]", nil %>
<% Ingredient.all.each do |ingredient| %>
<%= check_box_tag "fridge[ingredient_ids][]", ingredient.id,
@fridge.ingredient_ids.include?(ingredient.id), id: dom_id(ingredient) %>
<%= label_tag dom_id(ingredient), ingredient.name %><br>
<% end %>
</div>
<%= f.submit "Update" %>
<% end %>
这提供了在我看来正确的参数,并且 'Debug' 字段按应有的方式更新:
fridge: !ruby/hash:ActionController::Parameters
debug: ''
ingredient_ids:
- '1'
- '2'
commit: Update
controller: fridges
action: update
id: '2'
会不会是@fridge变量不对?当我测试它时,它似乎确实选择了正确的 Fridge 实例。目前是:
@fridge = current_user.fridge #using my auth method, and unavailable to
但是,当提交此项目的表单时,冰箱中未添加任何成分。 has-many-through 正在正常工作,可以在 Rails 控制台中添加和访问成分。
最后,值得注意的是,复选框选择了通过控制台添加的冰箱中现有的任何成分(即,如果我通过控制台将牛排添加到冰箱,这将在页面上的复选框列表中选中).
感谢您的帮助!
找到解决方案 - 参数未被清除以通过。在控制器中配置了强大的参数,一切顺利:
def fridge_params
params.require(:fridge).permit(:debug, { :ingredient_ids => [] })
end
我正在尝试实现一个 check_box_tag 来储存带有成分的冰箱模型对象;这两个模型通过具有多次关联的关系(FridgeIngredient 模型)链接在一起。值得注意的是,每个 Fridge 也属于一个用户,我担心这可能会以某种方式引起这里的问题(因为这是我从这段代码之前为我工作的地方可以看到的唯一区别)。
我之前已经成功地为一个多次通过的关系建立了一个复选框列表,虽然它在这个场合不起作用。以下表单代码(适用于这些模型)在其他地方有效,但现在无法更新冰箱:
<%= form_for(@fridge) do |f| %>
<!-- a debug column for testing -->
<%= f.label :debug %>
<%= f.text_field :debug
<!-- the checkboxes -->
<h2>Add ingredients to your Fridge</h2>
<div>
<% hidden_field_tag "fridge[ingredient_ids][]", nil %>
<% Ingredient.all.each do |ingredient| %>
<%= check_box_tag "fridge[ingredient_ids][]", ingredient.id,
@fridge.ingredient_ids.include?(ingredient.id), id: dom_id(ingredient) %>
<%= label_tag dom_id(ingredient), ingredient.name %><br>
<% end %>
</div>
<%= f.submit "Update" %>
<% end %>
这提供了在我看来正确的参数,并且 'Debug' 字段按应有的方式更新:
fridge: !ruby/hash:ActionController::Parameters
debug: ''
ingredient_ids:
- '1'
- '2'
commit: Update
controller: fridges
action: update
id: '2'
会不会是@fridge变量不对?当我测试它时,它似乎确实选择了正确的 Fridge 实例。目前是:
@fridge = current_user.fridge #using my auth method, and unavailable to
但是,当提交此项目的表单时,冰箱中未添加任何成分。 has-many-through 正在正常工作,可以在 Rails 控制台中添加和访问成分。
最后,值得注意的是,复选框选择了通过控制台添加的冰箱中现有的任何成分(即,如果我通过控制台将牛排添加到冰箱,这将在页面上的复选框列表中选中).
感谢您的帮助!
找到解决方案 - 参数未被清除以通过。在控制器中配置了强大的参数,一切顺利:
def fridge_params
params.require(:fridge).permit(:debug, { :ingredient_ids => [] })
end