如何在Rails中将一个复选框设为选中状态?

38

我使用以下 Rails 表单助手创建了复选框:

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

然而,我需要将其中一些默认选中。Rails文档没有指定如何实现。有什么办法吗?怎么做?


https://dev59.com/ElvUa4cB1Zd3GeqPqiQQ https://dev59.com/wXRB5IYBdhLWcg3wj36c - Jeremy D
3
这两个问题都没有解决原帖作者的使用情境。 - John Bachir
11个回答

60

以下是Rails 4的操作方法,我没有检查老版本的文档。

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

这将使复选框被选中。当然,您将放置一些逻辑来确定每个复选框是否被选中,而不是true


你如何给它贴上标签? - Jwan622
1
请注意,使用类似于“1”的字符串或像1这样的整数是不起作用的。因此,如果您有这些内容,请使用“to_boolean”将它们转换为布尔值。 - Joshua Pinter
1
同样适用于f.check_box,例如:f.check_box :my_check, { class: 'custom-control-input', checked: @model.check } - Mohamed AbuIssa

14
如果你需要在新建时选中check_box,并在编辑时正确填充,可以这样做: <%= f.check_box :subscribe, checked: @event.new_record? || f.object.subscribe? %> 正如我在这里所提到的。

这是最有用的答案,即使问题没有涉及到它。情况很可能会经常出现。 - Jerome

4
Rails文档确实说明了如何进行检查,这取决于对象。如果您没有一个实例对象可用于check_box,则最好的选择是使用上述的check_box_tag。如果您有实例对象,请继续阅读。 这里是关于check_box辅助程序的文档链接。基本上,它的工作原理是您必须定义一个实例变量。该实例变量必须具有返回整数或布尔值的方法。根据文档: 此对象必须是实例对象(@object),而不是本地对象。该方法旨在返回一个整数,如果该整数大于零,则复选框被选中。 例如,假设您在视图中有一个@tag实例,该实例具有一个enabled方法。以下代码段将导致当@tag对象上的enabled为true时,复选框被选中,并在其为false时取消选中。要默认启用它,请在控制器中将enabled属性设置为true。最后两个变量是您希望在选中和取消选中复选框时提交到表单的值。
<%= check_box "tag", "enabled", {}, "1", "0" %>

很多时候,你会看到check_box助手与表单生成器一起使用。因此,如果form_for用于@tag实例,你很可能会使用这个片段:
<%= f.check_box :enabled %>

3
不需要为Rails >= 4.0编写checked: true。只需简单地编写:
<%= check_box_tag "name", value, true %> # true or false

2
check_box_tag有一种设置为已选中的方法,而不是使用check_box

1

1

这个答案仅与f.check_box有关

f.check_box最多可以接受4个参数:

  1. 输入名称
  2. 包含选项的哈希,例如html类、id等
  3. 表示“已选中”的值(默认为“1”)
  4. 表示“未选中”的值(默认为“0”)

因此,如果您的布尔字段存储为1或0(Rails的默认值),那么一切都很好。Rails将识别字段是否被选中。

但是,如果您使用不同的数据存储或框架以另一种格式存储布尔值,则需要指定哪些值对应于选中和未选中。

以下是一个示例:

<%= f.check_box :accept_privacy_policy, { class: 'my-class' }, "true", "false" %>


参考文献


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") %>

1
你的意思是 def check_if_true(item) item == true || item == 'true' || item == 1 || item == '1' end - fatuhoku
@fatuhoku 你是指 def check_if_true(item) ActiveModel::Type::Boolean.new.cast(item) end - Vishal

0
这是我在2020年中的做法。
<%= form.check_box :with_cost, checked: true, class: '', type: 'checkbox', id: 'cost' %>

使用 checked: true 属性。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接