2011-05-24 2 views
2

Avoir un champ booléen (using formtastic) et la valeur ne persistera pas à travers une erreur. S'il est soumis et qu'une erreur existe, sur reload, le champ booléen se vérifie automatiquement, ce qui est mauvais. Je peux voir que le problème est dans la valeur conflictuelle, caché est 0 alors que l'entrée est 1. Les deux devraient être 0. Comment puis-je corriger cela, donc les deux sont mis à 0 initialement. Où vais-je mal?Rails forment un problème

Code Forme:

<%= f.input :legal, :as => :boolean %> 

Html Généré

<li class="boolean optional" id="user_legal_input"> 
    <input name="user[legal]" type="hidden" value="0" /> 
    <label for="user_legal"> 
     <input id="user_legal" name="user[legal]" type="checkbox" value="1" />I Agree to the legal terms 
    </label> 
</li> 

AJOUTÉE: User (Créer) Contrôleur

def create 
    @user = User.new(params[:user]) 
    respond_to do |format| 
     if @user.save 
     format.js 
     else 
     format.js 
     end 
    end 
    end 

Les js Relancez juste rend le formulaire avec toutes les erreurs inline

+0

Poster le code d'action du contrôleur (Create/mise à jour) s'il vous plaît –

+0

Si vous avez une section 'attr_accessible' dans votre modèle (user.rb), assurez-vous que vous avez ajouté ': legal' à la liste. –

+0

@john Gibb, c'est. Le problème est les valeurs initiales en conflit – John

Répondre

0

le champ caché est toujours mis à "0" pour imiter une case non cochée, c'est le comportement correct: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

A la place, je suggère que votre isssue soit votre méthode d'accès dans le modèle.

L'entrée de case est cochée si @ user.legal est vrai type, ou plus précisément si

ActionView::Helpers::InstanceTag.check_box_checked?(@user.legal,"1") 

valeur TRUE.

Maintenant, si légale est une colonne de base de données booléenne, rails initialiseur va convertir en rubis booléen donc si vous

@user = User.new(:legal => "0") 

puis

@user.legal == false 

mais si légale n'est pas une colonne db (sinon :as => :boolean est inutile), alors vous devez avoir défini une méthode d'accesseur en quelque sorte.

Si vous l'avez fait avec un simple attr_accessor puis,

@user.legal == "0" 

qui évalue correctement à une case non cochée.

mais si vous ou votre cadre voulu déjouer les rails et vous définissez:

attr_writer :legal 
def legal 
[email protected] 
end 

ou quelque chose de similaire sous le capot (pour vous donner un booléen bon dos), alors vous êtes en difficulté:

Ici l'affichage de la forme initiale !!nil est faux => case non cochée. mais sur soumettre/recharger !!"0" est vrai => case cochée.

me faire savoir si mon intuition est correcte :)

+0

Pensé que cela a fonctionné mais il n'a pas fonctionné.: legal n'est pas une colonne de base de données, avait comme un attr_ccessible qui faisait partie du problème. Vous ne savez pas comment le définir comme une méthode d'accesseur – John

+0

John quel ORM utilisez-vous? ActiveRecord? Comment avez-vous défini la méthode d'accès légal? faites-vous des transferts sur sa mission? –

+0

Merci pour l'aide, mais j'ai décidé de suivre votre conseil simple et juste ajouter une colonne de base de données nommée juridique. – John

Questions connexes