web-dev-qa-db-fra.com

comment ajouter une classe au composant d'entrée dans un wrapper dans simple_form 2

J'essaie d'avoir class="text" dans mes champs d'entrée lorsque j'utilise un wrapper personnalisé appelé: hinted in simple_form 2.0.0.rc

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

mais la sortie n'a pas cette classe, j'ai essayé 

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

en vain

Est-ce que quelqu'un sait comment cela est fait?

Je vous remercie!

14
Nik So

Actuellement, il n'y a aucun moyen de le faire. Vous pouvez utiliser les options defaults comme celle-ci si vous le souhaitez.

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

Avec: input_html fonctionne. C'est un peu maladroit. 

= f.input :email, :input_html => { :class => 'foo' }

Vous pouvez également définir toutes les entrées sur tous les éléments de formulaire:

simple_form_for(@user, :defaults => { :input_html => { :class => "foo" } })

Mais comme vous vous en doutez, cela s'applique à tout.

Vous pouvez créer des éléments de formulaire personnalisés:

# 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

Voir: https://github.com/plataformatec/simple_form/wiki/Adding-custom-input-components

Vous pouvez également créer un générateur de formulaire personnalisé:

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
33
Rimian

Cette fonctionnalité est sur le point d'être fusionnée pour être maîtrisée maintenant (oct. 2012):

https://github.com/plataformatec/simple_form/pull/622

Vous pouvez ensuite faire quelque chose comme ceci pour ajouter des attributs HTML directement sur le champ de saisie:

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
12
crispy

J'ai eu un problème similaire, mais il semble que cette fonctionnalité (le input_class one) ait été fusionnée après la version 3.0.0.

J'ai donc essayé de créer un patch de singe pour supporter au moins le code config.input_class = 'foo'

Mon intention n'est pas de créer un excellent patch pour le singe (en fait, j'aime cet article here pour le faire - le patch pour le singe), eh bien, ce n'est qu'une idée, mais cela fonctionne. Maintenant, je travaille avec le SimpleForm v2.1.3 et Bootstrap 4 - version alpha (la dernière n'est pas importante ici mais c'est uniquement à titre d'information)

voici le code pour le patch singe:

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

maintenant, vous pouvez faire quelque chose comme ça:

SimpleForm.setup do |config|
  # ...
  config.input_class = 'foo'
  #...
end
0
Johan Tique