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'
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
Vous pourriez utiliser
f.input :field_name, as: :boolean
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" }
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
:
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.