Comment puis-je faire en sorte qu'une case à cocher soit "cochée" lorsqu'elle est initialement affichée?
Je n'ai pas trouvé de méthode "Rails" pour faire cela (qui fonctionne) donc je l'ai fait avec JavaScript. Existe-t-il un moyen approprié de le faire dans Rails? J'utilise Rails 1.2.3.
Si vous utilisez check_box
dans le contexte d'un formulaire, la case à cocher affichera la valeur de ce champ.
@user = Person.find(:first)
@user.active = true
check_box 'user', 'active' #=> will be checked by default
Si vous utilisez check_box_tag
, le troisième paramètre est l'état initial ( check_box_tag
doc ):
check_box_tag "active", 1, true
Rails 3.x
= form_for(@user) do |f|
= f.check_box :subscribe, {checked: true, ...}
Cela définit l'état vérifié sur true et devrait fonctionner correctement. Notez la syntaxe Ruby 1.9.x du hachage, pour Ruby 1.8.x utilisez le format de balise de hachage {: vérifié => vrai, ...}
Dans la nouvelle action de votre contrôleur, essayez:
@user = User.new(:male => true)
Où: male est l'attribut que vous souhaitez vérifier par défaut sur le /users/new
pages. Cela passera le :male
attribut à la vue avec une valeur de true
, résultant en une case cochée.
J'ai été choqué qu'aucune des réponses ne résout 100% du problème.
Comme toutes les solutions suggérées donneront checked
résultat sur le formulaire d'édition, même si l'utilisateur a décoché la case.
<%= f.check_box :subscribe, checked: @event.new_record? || f.object.subscribe? %>
Fonctionne pour Rails 4 +, non testé ci-dessous.
Simple
<%= f.check_box :subscribe, checked: "checked" %>
Cela fonctionne sur Rails 2.3.x et Rails 3.0.x!
Lors d'une nouvelle action dans le contrôleur, la case à cocher est définie sur true.
# in the controller
def new
@user = Person.find(:first)
@user.active = true
end
Dans le formulaire: la case à cocher est cochée à la création (par appel nouveau) mais si la validation échoue, la case à cocher reste définie avec la valeur que l'utilisateur a publiée.
# in the view
<%= form_for ..... |f| %>
...
<%= f.check_box :active %>
...
<% end %>
Une autre façon, mais pas si bien (si vous voulez changer la logique, vous devez faire une nouvelle migration) est de définir : default => 1 dans la migration du modèle et de l'attribut donnés.
class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
...
t.boolean :active, :null => false,
:default => 1
t.timestamps
end
end
def self.down
drop_table :people
end
end
Je l'ai fait de cette façon.
Ajouter un champ masqué avec la valeur 0 AU-DESSUS check_box_tag
<%= hidden_field_tag :subscribe, '0' %>
<%= check_box_tag :subscribe, '1', params[:subscribe] != '0' %>
Sur le serveur, vérifiez avec != '0'
subscribe = params[:subscribe] != '0'