Ich verwende eine IF-Anweisung in Ruby on Rails, um zu testen, ob Anforderungsparameter festgelegt sind. Unabhängig davon, ob beide Parameter eingestellt sind oder nicht, wird der erste Teil des folgenden Blocks ausgelöst. Wie kann ich diesen Teil NUR auslösen lassen, wenn sowohl params [: one] als auch params [: two] gesetzt sind?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
ruby-on-rails
ruby
Darren
quelle
quelle
params
um eine Rails-Controller-Methode handelt (die zufällig einen HashWithIndifferentAccess zurückgibt), handelt es sich um Rails.Antworten:
Sie wollen
has_key?
:Nur das Überprüfen
if(params[:one])
wird durch einen "da aber null" und "da aber falsch" Wert getäuscht und Sie fragen nach der Existenz. Möglicherweise müssen Sie unterscheiden:nil
.false
.auch. Schwer zu sagen ohne weitere Details Ihrer genauen Situation.
quelle
nil
Parameter zu übergeben. Wenn der Parameter vorhanden ist, handelt es sich um eine leere Zeichenfolge.params
die nicht vorverarbeitet wurde, bevor wir dort ankommen , wo wir überprüfen, was darin enthalten ist. Daher meine Liste möglicher Sonderfälle zu überprüfen. Am besten genau sagen, was du meinst IMHO.key?
Methode nicht. edgeapi.rubyonrails.org/classes/ActionController/…params.to_h.key?
jetzt angerufen .Ich bin ein Fan von
params[:one].present?
Nur weil das
params[sym]
Formular so bleibt , dass es leichter zu lesen ist.quelle
has_key
gibt Ihnen stattdessen, was Sie suchen.leer verwenden? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
wird true zurückgeben, wenn es leer oder null ist
auch ... das wird nicht funktionieren, wenn Sie boolesche Werte testen .. da
in diesem Fall könnten Sie verwenden
quelle
present?
was das Gegenteil von zurückgibtblank?
. Sie könnten das alsounless
in ein verwandeln,if
wenn Sie wollten.unless
es ok. Aber ja, ich mag es besserif
mitpresent?
Sie können es prägnanter wie folgt schreiben:
quelle
Einfach wie Torte:
quelle
quelle
Eine sehr einfache Möglichkeit, Ihren Parametern Standardwerte bereitzustellen:
params[:foo] ||= 'default value'
quelle
params.fetch(:foo, 'default value')
auchIch habe dies gerade in den RubyInRails-Klassen http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F gelesen
Sie können eine
blank?
Methode verwenden, die äquivalent zu istparams[:one].nil? || params[:one].empty?
(z.B)
quelle
params[:one].nil? || params[:one].empty?
Sie können auch Folgendes tun:
Ich neige dazu, die obige Lösung zu verwenden, wenn ich mehr als ein oder zwei Parameter überprüfen möchte.
.values_at gibt ein Array mit nil anstelle eines undefinierten Parameterschlüssels zurück. dh:
wird folgendes zurückgeben:
.includes? (nil) überprüft dann das Array auf Nullwerte. Es wird true zurückgegeben, wenn das Array nil enthält.
In einigen Fällen möchten Sie möglicherweise auch überprüfen, ob Parameter keine leere Zeichenfolge für einen falschen Wert enthalten.
Sie können mit diesen Werten umgehen, indem Sie den folgenden Code über der if-Anweisung hinzufügen.
Alles in allem würde es so aussehen:
Es ist wichtig zu beachten, dass delete_if Ihre Hash / Parameter ändert. Verwenden Sie sie daher mit Vorsicht.
Die obige Lösung erfordert eindeutig etwas mehr Arbeit beim Einrichten, lohnt sich jedoch, wenn Sie mehr als nur ein oder zwei Parameter überprüfen.
quelle
Zusätzlich zu früheren Antworten:
has_key?
undhas_value?
haben kürzere Alternativen in Form vonkey?
undvalue?
. Das Ruby-Team schlägt auch die Verwendung kürzerer Alternativen vor. Aus Gründen der Lesbarkeit bevorzugen einige jedoch möglicherweise längere Versionen dieser Methoden.Daher wäre es in Ihrem Fall so etwas wie
NB!
.key?
prüft nur, ob der Schlüssel vorhanden ist und ignoriert den möglichen Wert. Zum Beispiel:quelle
Folgendes mache ich:
und dann folgende Methoden:
quelle
Einfach für das gleiche Problem zusammengesetzt:
In der ersten Zeile wird mithilfe der Teilmenge <= überprüft, ob unsere Zielschlüssel in den Parametern vorhanden sind. Operator. Enumerable.all? Standardmäßig wird ohne Block false zurückgegeben, wenn ein Wert null oder falsch ist.
quelle
Sie können auch überprüfen, ob die Parameter leer sind, indem Sie params [: two] .empty verwenden
quelle
Ich versuche eine späte, aber weitsichtige Antwort:
Wenn Sie wissen möchten, ob Werte in einem (beliebigen) Hash festgelegt sind, antworten alle oben genannten Antworten je nach Sichtweise mit true.
Wenn Sie Ihre (GET / POST ..) Parameter testen möchten, sollten Sie etwas Besonderes verwenden, das dem Wert entspricht
params[:one]
, den Sie erwarten, beispielsweiseIgnorieren von Parametern (GET / POST), als ob sie nicht gesetzt wären, wenn sie nicht wie erwartet passen
Nur eine
if params[:one]
Erkennung mit oder ohne Null / Wahr-Erkennung ist ein Schritt, um Ihre Seite zum Hacken zu öffnen, da dies normalerweise der nächste Schritt ist, um so etwas wieselect ... where params[:one] ...
, ob beabsichtigt oder nicht, aktiv oder innerhalb oder nach einem Framework zu verwenden.eine Antwort oder nur ein Hinweis
quelle