Ответ 1
В настоящее время нет способа сделать это. Вы можете использовать опции defaults
, как это, если хотите.
<%= simple_form_for(@user, :defaults => { :input_html => { :class => "text" } }) do %>
<%= f.input :name %>
<% end %>
Я пытаюсь иметь class="text"
в своих полях ввода при использовании настраиваемой обертки, называемой: hinted в simple_form 2.0.0.rc
config.wrappers :hinted do |b|
b.use :input, :class => "text"
end
но на выходе нет этого класса, я пробовал
:wrap_with => {:class => 'text'}
безрезультатно
Кто-нибудь знает, как это делается?
Спасибо!
В настоящее время нет способа сделать это. Вы можете использовать опции defaults
, как это, если хотите.
<%= simple_form_for(@user, :defaults => { :input_html => { :class => "text" } }) do %>
<%= f.input :name %>
<% end %>
С помощью: input_html работает. Это немного неуклюже.
= f.input :email, :input_html => { :class => 'foo' }
Вы также можете установить все входы для всех элементов формы:
simple_form_for(@user, :defaults => { :input_html => { :class => "foo" } })
Но, как и следовало ожидать, это относится ко всему.
Вы можете создавать пользовательские элементы формы:
# app/inputs/foo_input.rb
class FooInput < SimpleForm::Inputs::StringInput
def input_html_classes
super.push('foo')
end
end
// in your view:
= f.input :email, :as => :foo
Смотрите: https://github.com/plataformatec/simple_form/wiki/Adding-custom-input-components
Вы также можете создать собственный конструктор форм:
def custom_form_for(object, *args, &block)
options = args.extract_options!
simple_form_for(object, *(args << options.merge(builder: CustomFormBuilder)), &block)
end
class CustomFormBuilder < SimpleForm::FormBuilder
def input(attribute_name, options = {}, &block)
options[:input_html].merge! class: 'foo'
super
end
end
Теперь эта функция будет объединена для освоения (октябрь 2012 г.):
https://github.com/plataformatec/simple_form/pull/622
Затем вы можете сделать что-то подобное, чтобы добавить атрибуты HTML непосредственно в поле ввода:
SimpleForm.build :tag => :div, :class => "custom_wrapper" do |b|
b.wrapper :tag => :div, :class => 'elem' do |component|
component.use :input, :class => ['input_class_yo', 'other_class_yo']
component.use :label, :"data-yo" => 'yo'
component.use :label_input, :class => 'both_yo'
component.use :custom_component, :class => 'custom_yo'
end
end
У меня была аналогичная проблема, однако кажется, что эта функция (input_class одна) была объединена после версии 3.0.0.
Итак, я попытался сделать патч обезьяны для поддержки хотя бы кода config.input_class = 'foo'
Мое намерение - не делать большой патч обезьяны (на самом деле мне нравится эта статья здесь для этого - патч обезьяны), хорошо это только идея, но она работает, теперь я работаю с SimpleForm v2.1.3 и Bootstrap 4 - альфа-версией (последняя здесь не важна, но она предназначена только для информационных целей)
вот код для патча обезьяны:
module SimpleForm
mattr_accessor :input_class
@@input_class = nil
end
module SimpleForm
module Inputs
class Base
def html_options_for(namespace, css_classes)
html_options = options[:"#{namespace}_html"]
html_options = html_options ? html_options.dup : {}
css_classes << html_options[:class] if html_options.key?(:class)
css_classes << SimpleForm.input_class if namespace == :input && SimpleForm.input_class.present?
html_options[:class] = css_classes unless css_classes.empty?
html_options
end
end
end
end
теперь вы можете сделать что-то вроде этого:
SimpleForm.setup do |config|
# ...
config.input_class = 'foo'
#...
end
Вы можете установить это в инициализаторе простой_формы:
config.input_class= 'foo'
Это работает для меня:)