如何在不与模型关联的情况下添加simple_form复选框? 我想创建一个可以处理一些javascript事件的复选框,但不知道? 也许我错过了文档中的内容? 不希望使用类似如下的内容:
= simple_form_for(resource, as: resource_name, url: session_url(resource_name), wrapper: :inline) do |f|
.inputs
= f.input :email, required: false, autofocus: true
= f.input :password, required: false
= f.input :remember_me, as: :boolean if devise_mapping.rememberable?
= my_checkbox, 'some text'
答案 0 :(得分:35)
您可以向模型添加自定义属性:
class Resource < ActiveRecord::Base
attr_accessor :custom_field
end
然后将此字段用作块:
= f.input :custom_field, :label => false do
= check_box_tag :some_name
中找到“Wrapping Rails Form Helpers”
答案 1 :(得分:33)
您可以使用
f.input :field_name, as: :boolean
答案 2 :(得分:14)
huoxito提出的命令不起作用(至少在Rails 4中没有)。据我所知,错误是由Rails试图查找:custom_field
的默认值引起的,但由于此字段不存在,此查找失败并抛出异常。
但是,如果您使用:input_html
参数为字段指定默认值,则可行。像这样:
= f.input :custom_field, :as => :boolean, :input_html => { :checked => "checked" }
答案 3 :(得分:3)
这个问题首先出现在Google上,没有适当的答案。
从Simple Form 3.1.0.rc1开始,有一种正确的方法可以在wiki上解释:https://github.com/plataformatec/simple_form/wiki/Create-a-fake-input-that-does-NOT-read-attributes
app/inputs/fake_input.rb
:
class FakeInput < SimpleForm::Inputs::StringInput
# This method only create a basic input without reading any value from object
def input(wrapper_options = nil)
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
template.text_field_tag(attribute_name, nil, merged_input_options)
end
end
然后你可以
<%= f.input :thing, as: :fake %>
对于此特定问题,您必须将方法的第二行更改为:
template.check_box_tag(attribute_name, nil, merged_input_options)
对于3.1.0.rc1之前的版本,admgc提供的解决方案是添加缺少的方法merge_wrapper_options
:
答案 4 :(得分:2)
将此添加到app/inputs/arbitrary_boolean_input.rb
:
class ArbitraryBooleanInput < SimpleForm::Inputs::BooleanInput
def input(wrapper_options = nil)
tag_name = "#{@builder.object_name}[#{attribute_name}]"
template.check_box_tag(tag_name, options['value'] || 1, options['checked'], options)
end
end
然后在您的观看中使用它,如:
= simple_form_for(@some_object, remote: true, method: :put) do |f|
= f.simple_fields_for @some_object.some_nested_object do |nested_f|
= nested_f.input :some_param, as: :arbitrary_boolean
即。上述实现正确支持嵌套字段。我见过的其他解决方案都没有。
注意: 此示例为HAML。
答案 5 :(得分:1)
这是另一种变化形式:
= f.label :some_param, class: "label__class" do
= f.input_field :some_param, class: "checkbox__class"
Label text