首页 > 解决方案 > rails form_with check_box 不会在页面刷新时呈现对象的值

问题描述

以下形式允许通过 UJS 更改属性,正确呈现 HTML 的返回块

<% @product.productviews.each do |productview| %>
  <%= form_with(url: update_productview_products_path(productview_id: productview.id), method: :patch) do |form| %>
    <%= productview.active %> <%= form.check_box :active %> 
    <%= form.submit t('update') %>
  <% end %>
<% end %>

Producthas_many :productviews. 上下文:rails 6.1.3

然而,当刷新页面时,check_box 总是设置为 false,尽管属性的值是这样的:

<form action="/products/update_productview?productview_id=1" [...]
  true <input name="active" type="hidden" value="0" /><input type="checkbox" value="1" name="active" id="active" />  

<form action="/products/update_productview?productview_id=2" [...]
  true <input name="active" type="hidden" value="0" /><input type="checkbox" value="1" name="active" id="active" />  

<form action="/products/update_productview?productview_id=3" [...]
  true <input name="active" type="hidden" value="0" /><input type="checkbox" value="1" name="active" id="active" />  

<form action="/products/update_productview?productview_id=4" [...]
  false <input name="active" type="hidden" value="0" /><input type="checkbox" value="1" name="active" id="active" />  

这是出乎意料的。 Rails 指南指出 Array 参数不能很好地与 check_box 帮助器配合使用。这个实例不是数组参数的情况,虽然它是一个表单数组。

但是切换到<%= form.check_box_tag "active" %>or<%= form.check_box_tag :active %>将返回

undefined method `check_box_tag' for #<ActionView::Helpers::FormBuilder:

这似乎又与Rails 指南所声称的相反

check_box 可以在表单数组中使用吗?此复选框如何在页面加载时显示属性的值?

标签: ruby-on-rails

解决方案


您需要将模型传递给表单

<%= form_with(url: update_productview_products_path(productview_id: productview.id), method: :patch, model: productview) do |form| %>

如果这不起作用,您可以将 a 传递checkedcheck_box输入中,但我建议使用第一个选项(如果它有效)

<%= form.check_box :active, checked: productview.active %>

推荐阅读