Ich habe eine Rails-Anwendung und verwende jQuery, um meine Suchansicht im Hintergrund abzufragen. Es gibt Felder q
(Suchbegriff) start_date
,, end_date
und internal
. Das internal
Feld ist ein Kontrollkästchen und ich verwende die is(:checked)
Methode, um die abgefragte URL zu erstellen:
$.getScript(document.URL + "?q=" + $("#search_q").val() + "&start_date=" + $("#search_start_date").val() + "&end_date=" + $("#search_end_date").val() + "&internal=" + $("#search_internal").is(':checked'));
Jetzt liegt mein Problem darin, params[:internal]
dass es einen String gibt, der entweder "true" oder "false" enthält, und ich muss ihn in einen Booleschen Wert umwandeln. Natürlich kann ich das so machen:
def to_boolean(str)
return true if str=="true"
return false if str=="false"
return nil
end
Aber ich denke, es muss einen rubinroteren Weg geben, um mit diesem Problem umzugehen! Gibt es nicht ...?
quelle
ActiveRecord bietet hierfür eine saubere Möglichkeit.
ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
hat alle offensichtlichen Darstellungen von wahren Werten als Zeichenfolgen.quelle
ActiveRecord::ConnectionAdapters::Column.value_to_boolean(string)
(Quelle) apidock.com/rails/v3.0.9/ActiveRecord/ConnectionAdapters/Column/…ActiveRecord::Type::Boolean.new.type_cast_from_user("true")
=> wahrActiveRecord::Type::Boolean.new.type_cast_from_user("T")
=> wahrActiveModel::Type::Boolean
scheint ein viel geeigneterer Weg zu sein - obwohl erActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
"wahrheitsgemäße" Werte enthält, könnte man argumentieren, dass dies nur zufällig der Fall ist und dass Werte, die für diesen speziellen Anwendungsfall als wahrheitsgemäß angesehen werden sollten, aber nicht für andere eingeschlossen werden könnten. Auf der anderen SeiteActiveModel::Type::Boolean
ist offenbar so konzipiert, dass es generisch verwendet werden kann.Sicherheitshinweis
Beachten Sie, dass diese Antwort in ihrer bloßen Form nur für den anderen unten aufgeführten Anwendungsfall und nicht für den in der Frage aufgeführten geeignet ist. Obwohl größtenteils behoben, gab es zahlreiche Sicherheitslücken im Zusammenhang mit YAML, die durch das Laden von Benutzereingaben als YAML verursacht wurden.
Ein Trick, den ich zum Konvertieren von Strings in Bools verwende, ist
YAML.load
z.YAML Bool akzeptiert ziemlich viele wahrheitsgemäße / falsche Zeichenfolgen:
Ein weiterer Anwendungsfall
Angenommen, Sie haben einen Konfigurationscode wie diesen:
Und in der Kommandozeile:
Da
ENV
vars Zeichenfolgen sind, die sich einmal im Code befinden, istconfig.etc.something
der Wert der Zeichenfolge"false"
und wird fälschlicherweise ausgewertettrue
. Aber wenn dir das gefällt:es wäre alles in Ordnung. Dies ist auch mit dem Laden von Konfigurationen aus .yml-Dateien kompatibel.
quelle
Es gibt keine eingebaute Möglichkeit, damit umzugehen (obwohl Actionpack möglicherweise einen Helfer dafür hat). Ich würde so etwas raten
Was auch funktioniert, ist die Verwendung von 0 und Nicht-0 anstelle von falschen / wahren Literalen:
quelle
.match
etwas einfacher zu lesen ist.ActiveRecord::Type::Boolean.new.type_cast_from_user
tut dies gemäß den internen Zuordnungen von RailsConnectionAdapters::Column::TRUE_VALUES
undConnectionAdapters::Column::FALSE_VALUES
:Sie können also Ihre eigene
to_b
(oder /to_bool
oderto_boolean
) Methode in einem Initialisierer wie diesem erstellen:quelle
Sie können wannabe_bool gem verwenden. https://github.com/prodis/wannabe_bool
Dieses Juwel implementiert eine
#to_b
Methode für die Klassen String, Integer, Symbol und NilClass.quelle
In Rails 5 können Sie
ActiveRecord::Type::Boolean.new.cast(value)
es in einen Booleschen Wert umwandeln.quelle
Ich glaube nicht, dass so etwas in Ruby eingebaut ist. Sie können die String-Klasse erneut öffnen und dort die Methode to_bool hinzufügen:
Dann können Sie es überall in Ihrem Projekt verwenden, wie folgt:
params[:internal].to_bool
quelle
to_bool
Funktionsrückgabe haben wollennil
; das scheint falsch. Andere Konvertierungsfunktionen tun dies nicht:"a".to_i
kehrt zurück0
, nichtnil
Vielleicht der
str.to_s.downcase == 'true'
Vollständigkeit halber . Dann kann nichts abstürzen, auch wennstr
es null oder 0 ist.quelle
Wenn ich mir den Quellcode von Virtus anschaue , würde ich vielleicht so etwas tun:
quelle
Sie könnten betrachten nur Anfügen
internal
an Ihre URL , wenn es wahr ist, dann , wenn das Kontrollkästchen nicht aktiviert ist , und Sie hängen Sie es nichtparams[:internal]
wärenil
, das Ergebnis falsch in Ruby.Ich bin nicht so vertraut mit der spezifischen jQuery, die Sie verwenden, aber gibt es eine sauberere Möglichkeit, das aufzurufen, was Sie möchten, als manuell eine URL-Zeichenfolge zu erstellen? Hast du dir
$get
und$ajax
angeschaut?quelle
Sie können der String-Klasse die Methode to_boolean hinzufügen. Dann könnten Sie 'true'.to_boolean oder' 1'.to_boolean ausführen
quelle
Ich bin überrascht, dass niemand diese einfache Lösung veröffentlicht hat. Das ist, wenn Ihre Zeichenfolgen "wahr" oder "falsch" sein werden.
quelle
to_boolean("ActiveRecord::Base.connection.execute('DROP TABLE *')")
, wird Ihre Datenbank zerstört (und true zurückgegeben!). Viel Spaß: D.bool = nil; bool = eval(str) if ["true", "false"].include?(str)
Ich dachte nur, ich sollte sie zur Klarstellung hinzufügen.