2010-01-21 7 views
0

Je FAIScomparant params dans les rails

if params[:type] = "Type A" 
    # do something 
end 
if params[:type] = "Type B" 
    # do something 
end 

Mais je pense que ce qui ne va pas. Je devrais utiliser ==

Cependant cela me donne l'erreur:

Vous avez objet nul quand on ne s'y attendait pas

Quelle est la meilleure façon de le faire dans des rails?

Tout ce que je suis en train de faire est d'obtenir une variable de bouton radio à partir d'un formulaire et faire la logique en fonction de sa valeur (soit de type A ou de type B)

+0

A moins que vous ne fassiez quelque chose d'étrange avec 'params' * avant * ce bloc de code, l'erreur' nil object' ne vient certainement pas de la comparaison. Cela vient de ce qui se passe dans ce second bloc ou du fait qu'aucun bloc n'est en cours d'exécution. (Lorsque vous utilisez '=', le premier 'if' sera toujours évalué à' true', donc le premier bloc sera toujours évalué.) –

Répondre

5

Préambule

class Hash 
    def try(arg) 
    self[arg] rescue nil 
    end 
end 

Votre

if params.try(:type) == "Type A" 
    # do 
elsif params.try(:type) == "Type B" 
    # do 
end 

SEC

case params.try(:type) 
when "Type A" 
    # do 
when "Type B" 
    # do 
else 
    # default do 
end 
+1

+1 pour '# try', j'ai oublié – MBO

+0

L'objet # try fonctionne sur les instances des modèles ActiveRecord car ils fournissent tous * des méthodes * pour chaque champ de la ligne de la relation qu'ils représentent. Il ne fonctionne cependant pas sur un hachage car vous devez utiliser Hash # []/Hash # fetch pour accéder au contenu de hachage. – Caffeine

+0

La solution ne lance pas d'exception, car 'params' a la méthode' type', dont HashWithdifferentAccess/Hash a hérité de Object: C'est un alias obsolète pour Object # class. Voir http://ruby-doc.org/core/classes/Object.html#M000349 – Caffeine

3

Vous êtes sûr que cela devrait être params[:type]? Tout d'abord, vérifiez vos journaux pour voir ce qu'il y a dans les paramètres avant d'accéder à l'action dans le contrôleur.

Pour vérifier plusieurs choix que vous pouvez utiliser construction switch:

case params[:type] 
when "Type A" 
    # do sth 
when "Type B" 
    # do sth 
else # not A nor B, can be nil 
    # do nothing 
end 

Et si vous avez besoin à l'intérieur params vous pouvez alors utiliser plus profond if/else:

if params[:type] && params[:type][:value] == "sth" 
    # do sth 
elsif params[:type] && params[:type][:value] == "..." 
    # do sth 
end 

Et vérifier où vous obtenez votre erreur de, parce que dans Ruby vous pouvez facilement comparer nil et String, donc ce n'est pas à cause de l'utilisation == dans votre exemple.

Questions connexes