Comment tester si des parameters existent dans les rails

J’utilise une instruction IF dans Ruby on Rails pour essayer de tester si les parameters de requête sont définis. Que les deux parameters soient définis ou non, la première partie du bloc suivant est déclenchée. Comment puis-je rendre cette partie UNIQUEMENT déclenchée si les deux parameters [: one] et params [: two] sont définis?

if (defined? params[:one]) && (defined? params[:two]) ... do something ... elsif (defined? params[:one]) ... do something ... end 

Tu veux has_key? :

 if(params.has_key?(:one) && params.has_key?(:two)) 

Il suffit de vérifier if(params[:one]) sera trompé par une valeur “there but nil” et “there mais false” et vous posez des questions sur l’existence. Vous devrez peut-être différencier:

  • Pas du tout.
  • Il n’y a nil .
  • Là mais false .
  • Il n’y a qu’une chaîne vide.

ainsi que. Difficile à dire sans plus de détails sur votre situation précise.

Je suis un fan de

params[:one].present?

juste parce qu’il garde la forme params [sym], donc c’est plus facile à lire.

utiliser le 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 pourriez utiliser

 unless params[:one].to_s.blank? && params[:two].to_s.blank? 

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 

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 

Un moyen très simple de fournir des valeurs par défaut à vos parameters: 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 le blank? méthode équivalente à params[:one].nil? || params[:one].empty? params[:one].nil? || params[:one].empty?

(par exemple)

 if params[:one].blank? # do something if not exist else # do something if exist end 

Vous pouvez également effectuer les opérations suivantes:

 unless params.values_at(:one, :two, :three, :four).includes?(nil) ... excute code .. end 

J’ai tendance à utiliser la solution ci-dessus lorsque je veux vérifier plus d’un ou deux parameters.

.values_at retourne et tableau avec nil à la place de toute clé non définie. c’est à dire:

 some_hash = {x:3, y:5} some_hash.values_at(:x, :random, :y} 

renverra le texte suivant:

 [3,nil,5] 

.includes? (nil) vérifie alors le tableau pour toutes les valeurs nil. Il retournera true si le tableau inclut nil.

Dans certains cas, vous souhaiterez peut-être également vérifier que les parameters ne contiennent pas de chaîne vide sur la valeur fausse.

Vous pouvez gérer ces valeurs en ajoutant le code suivant au-dessus de l’instruction sauf.

 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 vos parameters de hachage, donc soyez prudent.

La solution ci-dessus nécessite clairement un peu plus de travail à mettre en place, mais cela en vaut la peine si vous ne cochez que plus d’un ou deux parameters.

Voici ce que je fais,

 before_action :validate_presence 

et ensuite les 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 
 if params[:one] && param[:two] ... excute code .. end 

Vous pouvez également vérifier si les parameters sont vides en utilisant params [: two] .empty

J’essaie un retard, mais de loin la réponse:

Si vous voulez savoir si les valeurs d’un hachage (n’importe lequel) sont définies, toutes les réponses ci-dessus sont vraies, en fonction de leur sharepoint vue.

Si vous voulez tester vos parameters (GET / POST ..), vous devriez utiliser quelque chose de plus spécial pour ce que vous attendez de la valeur de params[:one] , quelque chose comme:

 if params[:one]~=/ / and params[:two]~=/[az]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 nil / true la détection est une étape pour ouvrir votre page pour le piratage, parce que 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

Il suffit de reconstituer ceci 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 parameters en utilisant le sous-ensemble < =? opérateur. Enumerable.all? sans bloc par défaut renvoie false si une valeur est nulle ou fausse.

En plus des réponses précédentes: has_key? et has_value? avoir des alternatives plus courtes sous forme de key? et value? . L’équipe Ruby suggère également d’utiliser des alternatives plus courtes, mais pour plus de lisibilité, certaines pourraient préférer 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? vérifiera simplement 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