我如何告诉check_box方法不为'未选中'值添加隐藏的check_box?

时间:2010-12-15 11:30:09

标签: ruby-on-rails checkbox

我正在使用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。分配隐藏的领域似乎是最干净的解决方案。

谢谢 - 最多

4 个答案:

答案 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

请参阅Rails来源:3.24.1

答案 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存储在数据库中,并被视为真实值。