如何在rails中检查check_box?

问题描述 投票:31回答:8

我使用以下rails form helper创建了复选框:

<%= check_box("tag", tag.id) %>

但是,我需要默认检查其中一些。 rails文档没有指定如何执行此操作。有办法吗?怎么样?

ruby-on-rails ruby-on-rails-3 checkbox ruby-on-rails-3.2 form-helpers
8个回答
46
投票

这有一个非常直接的解决方案,由check_box直接支持(至少在rails 4中,我没有检查旧的文档)

<%= check_box("tag", tag.id, {checked: true}) %>

这将选中复选框。当然,不是true,你会输入一些逻辑,确定每一个是否被检查。


8
投票

如果您需要在new上检查check_box,并在edit上正确填写,您可以执行以下操作:

<%= f.check_box :subscribe, checked: @event.new_record? || f.object.subscribe? %>

正如我提到的here


4
投票

rails docs确实说如何检查它,它取决于对象。如果您没有要与check_box一起使用的实例对象,那么最好的选择是使用所提到的check_box_tag。如果你这样做,请继续阅读。

Here's the link到check_box帮助器上的文档。基本上这是如何工作的,你必须定义一个实例变量。该实例变量必须具有返回整数或布尔值的方法。来自文档:

此对象必须是实例对象(@object)而不是本地对象。它的目的是返回一个整数,如果该整数高于零,则选中该复选框。

例如,假设您的视图中有一个@tag实例,该实例具有启用的方法。当@tag对象上的enabled为true时,以下代码段将导致复选框被检查,当它为false时,将取消选中该复选框。要在默认情况下启用它,请在控制器中将enabled属性设置为true。最后两个变量是选中并取消选中复选框时要与表单一起提交的值。

<%= check_box "tag", "enabled", {}, "1", "0" %>

很多时候,您会看到与表单构建器一起使用的check_box助手。因此,如果将form_for用于@tag实例,您很可能会使用此代码段:

<%= f.check_box :enabled %>

2
投票

check_box_tag而不是check_box有一种方法来确定它已被检查。


2
投票

无需写入检查:对于rails> = 4.0,只需写入

<%= check_box_tag "name", value, true %> # true or false

0
投票

使用check_box_tag你可以将它设置为true,以便它已经被检查。更多信息:http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag


0
投票

所有这些解决方案的问题在于它在重新提交时与params哈希不匹配,所以目前我正在使用这样的东西,

# ApplicationHelper
def resolve_boolean_parameter resource, attribute, options = {}
  default = options.delete(:default)
  return default unless params[:utf8]

  return params[resource][attribute] == "1"
end

然后在视图中:

<div><%= f.label :accepts_newsletter, "Receive Newsletters" %>
  <%= f.check_box :accepts_newsletter, :checked => resolve_boolean_parameter(:user, :accepts_newsletter, default: true)  %>
</div>

0
投票

新功能放在你的助手中

def check_if_true(item)
  ActiveModel::Type::Boolean.new.cast(item)
end

在你的视图中

<%= check_box("test", "active", {checked: check_if_true(@test.active) , :multiple => true, :style => "margin-left: 16px;"}, "true", "false") %>
© www.soinside.com 2019 - 2024. All rights reserved.