我使用以下rails form helper创建了复选框:
<%= check_box("tag", tag.id) %>
但是,我需要默认检查其中一些。 rails文档没有指定如何执行此操作。有办法吗?怎么样?
这有一个非常直接的解决方案,由check_box
直接支持(至少在rails 4中,我没有检查旧的文档)
<%= check_box("tag", tag.id, {checked: true}) %>
这将选中复选框。当然,不是true
,你会输入一些逻辑,确定每一个是否被检查。
如果您需要在new
上检查check_box,并在edit
上正确填写,您可以执行以下操作:
<%= f.check_box :subscribe, checked: @event.new_record? || f.object.subscribe? %>
正如我提到的here
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 %>
check_box_tag
而不是check_box
有一种方法来确定它已被检查。
无需写入检查:对于rails> = 4.0,只需写入
<%= check_box_tag "name", value, true %> # true or false
使用check_box_tag
你可以将它设置为true
,以便它已经被检查。更多信息:http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
所有这些解决方案的问题在于它在重新提交时与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>
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") %>