Как добавить класс к входному компоненту в обертке в simple_form 2

Я пытаюсь иметь class="text" в своих полях ввода при использовании настраиваемой обертки, называемой: hinted в simple_form 2.0.0.rc

config.wrappers :hinted do |b|
  b.use :input, :class => "text"
end

но на выходе нет этого класса, я пробовал

:wrap_with => {:class => 'text'} 

безрезультатно

Кто-нибудь знает, как это делается?

Спасибо!

Ответы

Ответ 1

В настоящее время нет способа сделать это. Вы можете использовать опции defaults, как это, если хотите.

<%= simple_form_for(@user, :defaults => { :input_html => { :class => "text" } }) do %>
  <%= f.input :name %>
<% end %>

Ответ 2

С помощью: 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

Ответ 3

Теперь эта функция будет объединена для освоения (октябрь 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

Ответ 4

У меня была аналогичная проблема, однако кажется, что эта функция (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

Ответ 5

Вы можете установить это в инициализаторе простой_формы:

config.input_class= 'foo'

Это работает для меня:)