J'utilise une instruction IF dans Ruby on Rails pour essayer de tester si les paramètres de demande sont définis. Indépendamment du fait que les deux paramètres sont définis ou non, la première partie de ce qui suit si le bloc est déclenchée. Comment puis-je faire déclencher cette partie UNIQUEMENT si les paramètres [: one] et params [: two] sont définis?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
ruby-on-rails
ruby
Darren
la source
la source
params
s'agit d'une méthode de contrôleur Rails (qui retourne un HashWithIndifferentAccess), il s'agit de Rails.Réponses:
Vous voulez
has_key?
:La simple vérification
if(params[:one])
sera trompée par une valeur «là mais nul» et «là mais faux» et vous posez des questions sur l'existence. Vous devrez peut-être différencier:nil
.false
.ainsi que. Difficile à dire sans plus de détails sur votre situation précise.
la source
nil
paramètre. Si le paramètre existe, ce sera une chaîne vide.params
n'ait pas été prétraité avant d'arriver à l'endroit où nous vérifions ce qu'il contient. D'où ma liste de cas particuliers possibles à vérifier. Mieux vaut dire exactement ce que vous voulez dire à mon humble avis.key?
méthode. edgeapi.rubyonrails.org/classes/ActionController/...params.to_h.key?
depuis maintenant.Je suis un fan de
params[:one].present?
Simplement parce qu'il conserve le
params[sym]
formulaire pour qu'il soit plus facile à lire.la source
has_key
vous donne plutôt ce que vous recherchez.utiliser du blanc? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
retournera vrai si c'est vide ou nul
aussi ... cela ne fonctionnera pas si vous testez des valeurs booléennes .. puisque
dans ce cas, vous pouvez utiliser
la source
present?
qui renvoie le contraire deblank?
. Vous pouvez doncunless
en faire unif
si vous le souhaitez.unless
ça va. Mais ouais, j'aime mieuxif
avecpresent?
Vous pouvez l'écrire plus succinctement comme suit:
la source
Simple comme bonjour:
la source
la source
Un moyen très simple de fournir des valeurs par défaut à vos paramètres:
params[:foo] ||= 'default value'
la source
params.fetch(:foo, 'default value')
aussiJe viens de lire ceci sur les classes RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
vous pouvez utiliser une
blank?
méthode équivalente àparams[:one].nil? || params[:one].empty?
(par exemple)
la source
params[:one].nil? || params[:one].empty?
Vous pouvez également effectuer les opérations suivantes:
J'ai tendance à utiliser la solution ci-dessus lorsque je veux vérifier plus d'un ou deux paramètres.
.values_at renvoie un tableau avec nil à la place de toute clé de paramètre non définie. c'est à dire:
renverra ce qui suit:
.includes? (nil) vérifie alors le tableau pour toutes les valeurs nil. Il retournera true si le tableau inclut nil.
Dans certains cas, vous pouvez également vérifier que les paramètres ne contiennent pas de chaîne vide sur une valeur fausse.
Vous pouvez gérer ces valeurs en ajoutant le code suivant au-dessus de l'instruction sauf.
tous ensemble, cela ressemblerait à ceci:
Il est important de noter que delete_if modifiera votre hachage / paramètres, utilisez donc avec prudence.
La solution ci-dessus demande clairement un peu plus de travail à mettre en place, mais en vaut la peine si vous vérifiez plus d'un ou deux paramètres.
la source
En plus des réponses précédentes:
has_key?
ethas_value?
ont des alternatives plus courtes sous forme dekey?
etvalue?
. L'équipe Ruby suggère également d' utiliser des alternatives plus courtes, mais pour plus de lisibilité certains pourraient encore préférer des versions plus longues de ces méthodes.Par conséquent, dans votre cas, ce serait quelque chose comme
NB!
.key?
vérifiera simplement si la clé existe et ignore la valeur possible. Par exemple:la source
Voilà ce que je fais
puis les méthodes suivantes:
la source
Juste reconstitué ceci pour le même problème:
la première ligne vérifie si nos clés cibles sont présentes dans les clés des paramètres en utilisant le sous-ensemble <=? opérateur. Enumerable.all? sans bloc par défaut renvoie false si une valeur est nulle ou fausse.
la source
Vous pouvez également vérifier si les paramètres sont vides en utilisant params [: two] .empty
la source
J'essaye une réponse tardive, mais de loin:
Si vous voulez savoir si les valeurs d'un hachage (quelconque) sont définies, tout ce qui précède répond à un vrai, en fonction de leur point de vue.
Si vous voulez tester vos paramètres (GET / POST ..), vous devez utiliser quelque chose de plus spécial que ce que vous attendez d'être la valeur
params[:one]
, quelque chose commeignorer le paramètre (GET / POST) comme s'ils n'étaient pas définis, s'ils ne correspondent pas comme prévu
juste une
if params[:one]
détection avec ou sans nil / true est une étape pour ouvrir votre page pour le piratage, car c'est généralement la prochaine étape d'utiliser quelque chose commeselect ... where params[:one] ...
, si cela est prévu ou non, actif ou dans ou après un cadre.une réponse ou juste un indice
la source