добавить флажок с Simple_form без связи с моделью? - PullRequest
25 голосов
/ 07 февраля 2012

Как я могу добавить флажок с 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'

Ответы [ 5 ]

35 голосов
/ 08 февраля 2012

Вы можете добавить пользовательский атрибут к модели:

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

33 голосов
/ 16 февраля 2013

Вы можете использовать

f.input :field_name, as: :boolean
14 голосов
/ 08 июля 2013

Команда, предложенная huoxito, не работает (по крайней мере, в Rails 4). Насколько я понял, ошибка вызвана тем, что Rails пытается найти значение по умолчанию для :custom_field, но из-за того, что это поле не существует, поиск не выполняется, и возникает исключение.

Однако это работает, если вы задаете значение по умолчанию для поля с помощью параметра :input_html, например, как это:

= f.input :custom_field, :as => :boolean, :input_html => { :checked => "checked" }
3 голосов
/ 05 мая 2015

В Google этот вопрос стоит первым без соответствующего ответа.

Начиная с простой формы 3.1.0.rc1, в вики есть правильный способ объяснения: 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:

https://stackoverflow.com/a/26331237/2055246

2 голосов
/ 17 сентября 2015

Добавьте это к 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.

...