Добавить флажок с simple_form без связи с моделью?
Как я могу добавить флажок с 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'
Ответы
Ответ 1
Вы можете добавить пользовательский атрибут к модели:
class Resource < ActiveRecord::Base
attr_accessor :custom_field
end
Затем используйте это поле как блок:
= f.input :custom_field, :label => false do
= check_box_tag :some_name
Попытайтесь найти "Помощники формы обхода рельсов" в своей документации https://github.com/plataformatec/simple_form
Ответ 2
Вы можете использовать
f.input :field_name, as: :boolean
Ответ 3
Команда, предложенная huoxito, не работает (по крайней мере, не в Rails 4). Насколько я понял, ошибка вызвана тем, что Rails пытается найти значение по умолчанию для :custom_field
, но поскольку это поле не существует, этот поиск не выполняется и генерируется исключение.
Однако он работает, если вы укажете значение по умолчанию для поля, используя параметр :input_html
, например. например:
= f.input :custom_field, :as => :boolean, :input_html => { :checked => "checked" }
Ответ 4
Этот вопрос идет первым в 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
:
fooobar.com/questions/86030/...
Ответ 5
Добавьте это в 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.