我正在使用rails 2.3.4,当你在form_for中的'f'对象上调用.check_box时,为'checked'值创建一个可见的复选框输入,并为'unchecked'隐藏复选框输入'价值:http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002434&name=check_box
这个问题是我在check_box上有一个validates_acceptance_of验证,如果没有检查,我得到一个包围可见复选框和隐藏复选框的field_with_errors div,以便错误信息出现两次。 / p>
在这种情况下,我不希望在'未经检查'的情况下传递一个值,所以我不希望rails添加隐藏的复选框 - 这(关闭隐藏的复选框)将解决我的问题。我无法弄清楚如何告诉它不添加隐藏的复选框。有谁能告诉我?
我知道我可以通过制作一个check_box_tag来解决这个问题,它不会添加隐藏的“未选中”案例复选框,但是如果没有选中,我不会在复选框中包含field_with_errors。分配隐藏的领域似乎是最干净的解决方案。
谢谢 - 最多
答案 0 :(得分:33)
在Rails 4中,您可以使用include_hidden: false
示例f.check_box :some_field, include_hidden: false
答案 1 :(得分:5)
使用<%= check_box_tag "your_model[your_field]" %>
f.check_box
总是会给你一个隐藏的字段。
答案 2 :(得分:4)
自Rails 3.2以来,如果unchecked_value
参数的计算结果为false
,则不会显示隐藏字段。
示例:f.check_box :your_field, {}, checked_value, false
答案 3 :(得分:1)
所以这很有趣。如方法定义所示,check_box带有四个参数:
def check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")
Tags::CheckBox.new(object_name, method, self, checked_value, unchecked_value, options).render
end
选中的值和未选中的值必须是第三个和第四个参数。通过设置一个unchecked_value来评估为真实值,那么隐藏的输入将出现。
我最初的目标是要有一个值为true的可见复选框,以及一个值为false的隐藏复选框。所以我尝试这样做:
<%= f.check_box :share, { }, true, false %>
但是,因为我实际上传递了一个布尔值来表示未检查的值,所以它使隐藏字段根本没有出现!我在Rails源代码中找到了这行代码:
def hidden_field_for_checkbox(options)
@unchecked_value ? tag("input", options.slice("name", "disabled", "form").merge!("type" => "hidden", "value" => @unchecked_value)) : "".html_safe
end
如果@unchecked_value的值为false或nil,则不会显示任何隐藏的输入字段。现在,如果您想使用check_box helper发送true和false值而不是'1'或'0',则需要将布尔值包装在字符串中:
<%= f.check_box :share, { }, 'true', 'false' %>
但是如果是这样,那么就很重要了,只需将默认值'1'
和'0'
用于布尔值,然后让Rails处理即可。
Rails将布尔值存储为TinyInt,至少对于MySQL数据库而言。因此,“ 1”将作为1存储在数据库中,并被视为真实值。