2010-07-17 2 views
0

Pourquoi la seconde instruction if échoue-t-elle dans le bloc de code suivant? La sortie de la console indique que le paramètre private est 0, donc il devrait passer? Le paramètre private provient d'une case à cocher dans le nouveau formulaire que j'utilise pour définir un champ booléen dans le modèle.RoR: Pourquoi cette instruction if échoue-t-elle?

if (((params[:note])[:text]) != "") 
    logger.debug("passed first test") 
    logger.debug(((params[:note])[:private])) 
    if (((params[:note])[:private]) == 0) 
    logger.debug("passed second test") 
    end 
end 

sortie de la console

passed first test 
0 
Completed in 61ms (DB: 1) | 302 Found [http://localhost/notes] 

Merci pour la lecture.

Répondre

4

Les champs de formulaire sont soumis en tant que chaînes de sorte que params[:notes][:private] contiendra effectivement "0" et non 0.

Vous pouvez utiliser params[:notes][:private] == "0" ou params[:notes][:private].to_i == 0 pour obtenir la comparaison que vous recherchez.

Si vous souhaitez traiter les valeurs non entières (y compris les chaînes vides et les valeurs manquantes) différemment de 0, vous ne devez pas utiliser String#to_i. Je recommande de vérifier la valeur de la chaîne dans ces cas.

Vous pouvez utiliser Object#inspect (comme mentionné par @ sepp2k) et Object#class lors du débogage pour avoir une meilleure idée de ce que sont les types. En utilisant script/console, je trouve que ap (ou pp) est plutôt pratique.


Remarque: Dans Ruby, vous n'avez pas besoin de tant de parenthèses. Voici votre exemple après un peu de nettoyage:

unless params[:note][:text].blank? 
    logger.debug "passed first test" 
    logger.debug params[:note][:private].inspect 
    if params[:note][:private].to_i == 0 
    logger.debug "passed second test" 
    end 
end 
+0

Merci pour votre réponse. Merci aussi pour votre note de côté, je suis assez nouveau pour RoR, mon code est beaucoup plus joli maintenant! – ben

+0

Je ne voudrais pas simplement lancer un 'params [: note] [: private] .to_i == 0'. Essayez 'nil.to_i' ou' "Pas un nombre" .to_i', cela peut causer des maux de tête dans le futur – Chubas

+0

@Chubas Oui, tout ce qui n'est pas analysable comme un entier donnera '0' comme résultat. Cela vaut la peine d'être noté. Généralement pour les paramètres numériques, on s'intéresse à si quelque chose est différent de zéro ou non. –

1

Lorsque deux expressions s'impriment de la même manière mais ne sont pas identiques, vous avez généralement des types différents. Par exemple "0", :"0" et 0 les deux imprimer comme 0, mais ne sont pas réellement égaux les uns aux autres.

logger.debug(params[:note][:private].inspect) devrait vous donner une sortie plus significative, en indiquant le type de l'objet ainsi que le contenu (c'est-à-dire s'il s'agit d'une chaîne entourée de guillemets, s'il s'agit d'un symbole commençant par deux points, etc.).

Les valeurs params sont généralement des chaînes, de sorte que la valeur de params[:note][:private] est très probablement "0", pas 0.