web-dev-qa-db-fra.com

ajouter une case à cocher avec simple_form sans association avec le modèle?

Comment puis-je ajouter une case à cocher avec simple_form sans association avec le modèle? Je veux créer une case à cocher qui gérera certains événements javascript, mais je ne sais pas? Peut-être que je manque quelque chose dans la documentation? Je ne veux pas utiliser des éléments similaires, comme suit:

= 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'
27
Mikhail Grishko

Vous pouvez ajouter un attribut personnalisé au modèle:

class Resource < ActiveRecord::Base
  attr_accessor :custom_field
end

Utilisez ensuite ce champ comme bloc:

= f.input :custom_field, :label => false do 
  = check_box_tag :some_name

Essayez de trouver "Wrapping Rails Form Helpers" dans leur documentation https://github.com/plataformatec/simple_form

36
Gacha

Vous pourriez utiliser

f.input :field_name, as: :boolean
33
huoxito

La commande proposée par huoxito ne fonctionne pas (du moins pas dans Rails 4). Pour autant que je sache, l'erreur est causée par Rails essayant de regarder la valeur par défaut pour :custom_field, mais comme ce champ n'existe pas, cette recherche échoue et une exception est levée.

Cependant, cela fonctionne si vous spécifiez une valeur par défaut pour le champ à l'aide de :input_html paramètre, par exemple comme ça:

= f.input :custom_field, :as => :boolean, :input_html => { :checked => "checked" }
15
m4r73n

Cette question vient en premier sur google sans réponse appropriée.

Depuis Simple Form 3.1.0.rc1, il existe une manière appropriée de le faire expliquée sur le 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

Ensuite, vous pouvez faire <%= f.input :thing, as: :fake %>

Pour cette question spécifique, vous devez modifier la deuxième ligne de la méthode en:

template.check_box_tag(attribute_name, nil, merged_input_options)

Pour les versions antérieures à 3.1.0.rc1, admgc a fourni une solution qui ajoute la méthode manquante merge_wrapper_options:

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

3
eXa

Ajoutez ceci à 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

puis utilisez-le dans vos vues comme:

= 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

c'est-à-dire que l'implémentation ci-dessus prend correctement en charge les champs imbriqués. D'autres solutions que j'ai vues ne le font pas.

Remarque: Cet exemple est HAML.

2
Benjamin Dobell