J'utilise une instruction IF dans Ruby sur Rails pour essayer de tester si les paramètres de demande sont définis. Que les deux paramètres soient définis ou non, la première partie de ce qui suit si le bloc est déclenché. Comment puis-je faire que cette partie soit déclenchée UNIQUEMENT si les paramètres params [: one] et params [: two] sont définis?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
Vous voulez has_key?
:
_if(params.has_key?(:one) && params.has_key?(:two))
_
Le simple fait de vérifier if(params[:one])
va se laisser berner 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.
Je suis un fan de
params[:one].present?
Simplement parce que la forme params[sym]
est conservée, ce qui la rend plus facile à lire.
utiliser en blanc? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
unless params[:one].blank? && params[:two].blank?
retournera vrai si c'est vide ou nul
aussi ... cela ne fonctionnera pas si vous testez des valeurs booléennes .. depuis
>> false.blank?
=> true
dans ce cas, vous pouvez utiliser
unless params[:one].to_s.blank? && params[:two].to_s.blank?
Vous pouvez l'écrire plus succinctement comme suit:
required = [:one, :two, :three]
if required.all? {|k| params.has_key? k}
# here you know params has all the keys defined in required array
else
...
end
Simple comme bonjour:
if !params[:one].nil? and !params[:two].nil?
#do something...
elsif !params[:one].nil?
#do something else...
elsif !params[:two].nil?
#do something extraordinary...
end
Un moyen très simple de fournir des valeurs par défaut à vos paramètres: params[:foo] ||= 'default value'
if params[:one] && params[:two]
... do something ...
elsif params[:one]
... do something ...
end
Je viens de lire ceci sur les classes RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
vous pouvez utiliser la méthode blank?
qui est équivalente à params[:one].nil? || params[:one].empty?
(par exemple)
if params[:one].blank?
# do something if not exist
else
# do something if exist
end
En plus des réponses précédentes: has_key?
et has_value?
ont alternatives plus courtes sous la forme de key?
et value?
. Ruby team aussi suggère en utilisant des alternatives plus courtes, mais pour lisibilité , certains préfèreront peut-être encore des versions plus longues de ces méthodes.
Par conséquent, dans votre cas, ce serait quelque chose comme
if params.key?(:one) && params.key?(:two)
... do something ...
elsif params.key?(:one)
... do something ...
end
NB! .key?
va simplement vérifier si la clé existe et ignore la valeur possible. Pour ex:
2.3.3 :016 > a = {first: 1, second: nil, third: ''}
=> {:first=>1, :second=>nil, :third=>""}
2.3.3 :017 > puts "#{a.key?(:first)}, #{a.key?(:second)}, #{a.key?(:third), #{a.key?(:fourth)}}"
true, true, true, false
Vous pouvez également faire ce qui suit:
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
J'ai tendance à utiliser la solution ci-dessus lorsque je souhaite vérifier plus d'un ou deux paramètres.
.values_at retourne et array avec nil à la place de toute clé param non définie. c'est à dire:
some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}
retournera ce qui suit:
[3,nil,5]
.includes? (nil) vérifie ensuite le tableau pour toutes les valeurs nil. Il renverra true si le tableau inclut nil.
Dans certains cas, vous voudrez peut-être é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 less.
params.delete_if{|key,value| value.blank?}
tous ensemble cela ressemblerait à ceci:
params.delete_if{|key,value| value.blank?}
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
Il est important de noter que delete_if modifiera votre hash/params, donc utilisez-le avec prudence.
La solution ci-dessus demande clairement un peu plus de travail à configurer mais en vaut la peine si vous vérifiez plus d'un ou deux paramètres.
Je viens de reconstituer cela ensemble pour le même problème:
before_filter :validate_params
private
def validate_params
return head :bad_request unless params_present?
end
def params_present?
Set.new(%w(one two three)) <= (Set.new(params.keys)) &&
params.values.all?
end
la première ligne vérifie si nos clés cibles sont présentes dans les clés des paramètres à l'aide du sous-ensemble <=? opérateur. Enumerable.all? sans bloc par défaut renvoie false si l'une des valeurs est nulle ou false.
Voici ce que je fais
before_action :validate_presence
et ensuite méthodes suivantes:
def check_presence
params[:param1].present? && params[:param2].present?
end
def validate_presence
if !check_presence
render json: {
error: {
message: "Bad Request, parameters missing.",
status: 500
}
}
end
end
J'essaie en retard, mais de loin, réponds:
Si vous voulez savoir si les valeurs dans un (n'importe quel) hachage sont définies, toutes les réponses ci-dessus répondent à true, 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 comme valeur de params[:one]
, quelque chose comme:
if params[:one]~=/ / and params[:two]~=/[a-z]xy/
ignorer le paramètre (GET/POST) comme si elles n'étaient pas définies, si elles ne correspondent pas comme prévu
juste un if params[:one]
avec ou sans détection nil/true est une étape pour ouvrir votre page pour le piratage, car c'est généralement la prochaine étape pour utiliser quelque chose comme select ... 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
if params[:one] && param[:two]
... excute code ..
end
Vous pouvez aussi vérifier si les paramètres sont vides en utilisant params [: two] .empty