Ich war ein böses Kind und habe in meinen Teilvorlagen die folgende Syntax verwendet, um Standardwerte für lokale Variablen festzulegen, wenn beim Rendern des Teil-Hashs kein expliziter Wert im: local-Hash definiert wurde.
<% foo = default_value unless (defined? foo) %>
Dies schien bis vor kurzem gut zu funktionieren, als (ohne Grund, den ich erkennen konnte) nicht übergebene Variablen sich so verhielten, als wären sie auf Null (anstatt auf undefiniert) definiert worden.
Wie von verschiedenen hilfreichen Personen auf SO erwähnt, sagt http://api.rubyonrails.org/classes/ActionView/Base.html , nicht zu verwenden
defined? foo
und stattdessen zu verwenden
local_assigns.has_key? :foo
Ich versuche, meine Methoden zu ändern, aber das bedeutet, viele Vorlagen zu ändern.
Kann / sollte ich einfach im Voraus aufladen und diese Änderung in allen Vorlagen vornehmen? Gibt es irgendwelche Schwierigkeiten, auf die ich achten muss? Wie sorgfältig muss ich jeden einzelnen testen?
quelle
local_assigns.fetch
Behandelt gerade Schlüssel mit Nullwert perfekt. Es wird nur dann eine Standardeinstellung zurückgegeben, wenn der Schlüssel überhaupt nicht festgelegt ist.Da
local_assigns
es sich um einen Hash handelt, können Sie auch fetch mit dem optionalen verwendendefault_value
.Dies wird zurückgegeben,
default_value
wennfoo
es nicht festgelegt wurde.WARNUNG:
Seien Sie vorsichtig mit
local_assigns.fetch :foo, default_value
wanndefault_value
ist eine Methode, da sie sowieso aufgerufen wird, um ihr Ergebnis an zu übergebenfetch
.Wenn es sich bei Ihrer
default_value
Methode um eine Methode handelt, können Sie sie in einen Block einschließenlocal_assigns.fetch(:foo) { default_value }
, um den Aufruf zu verhindern, wenn sie nicht benötigt wird.quelle
nil
Werte bleiben hier erhalten. Wenn der Hash:foo
zugeordnet istnil
,fetch
wird er zurückgegebennil
. Das heißt, zumindest auf meiner v1.9.3. Ich kann mich nicht erinnern, wie sich 1.8 verhalten hat.local_assigns[:foo] || default_value
wenn foo einen falschen Wert zurückgibt,default_value
wird stattdessen der verwendet. Es ist normalerweise ein Problem für Memoization,@some_value ||= expensive_method
wenn die Methode einen falschen Wert zurückgibt. Sie wird immer ausgeführt.foo ||= local_assigns[:foo] = local_assigns.fetch(:foo, default_value)
foo = local_assigns.fetch :foo, true
Wie wäre es mit
Hier steht "benutze,
foo
wenn es nicht null oder wahr ist. Sonstdefault_value
foo zuweisen "quelle
foo
es sich um einen Booleschen Wert handelt. Es kann zu Recht den Wert vonfalse
haben und versehentlich überschrieben werdendefault_value
.Ich denke, dies sollte hier wiederholt werden (von http://api.rubyonrails.org/classes/ActionView/Base.html ):
Wenn Sie herausfinden möchten, ob einer bestimmten lokalen Variablen in einem bestimmten Renderaufruf ein Wert zugewiesen wurde, müssen Sie das folgende Muster verwenden:
Testen mit definiert? Überschrift wird nicht funktionieren. Dies ist eine Implementierungsbeschränkung.
quelle
In meinem Fall verwende ich:
in meinem Teil.
Ich habe keine Ahnung, ob das gut ist, aber für mich ist es in Ordnung
quelle
nil
als lokal im Teilaufruf.variable
es sich um einen Booleschen Wert handelt und Sie ihn einstellen müssenfalse
. Es wird der Standardwert anstelle desfalse
Werts verwendet. BENUTZUNG AUF EIGENE GEFAHR.Ich weiß, dass es ein alter Thread ist, aber hier ist mein kleiner Beitrag: Ich würde
local_assigns[:foo].presence
in einer Bedingung innerhalb des Teils verwenden. Dann setze ichfoo
nur bei Bedarf im Renderaufruf:Schauen Sie sich hier den offiziellen Rails-Guide an . Gültig ab RoR 3.1.0.
quelle
local_assigns[:foo]
und sehenlocal_assigns[:foo].presence
. Entweder wird zurückgegeben,nil
wenn der Schlüssel nicht im Hash vorhanden ist, und der Wert, wenn er vorhanden ist.Ich denke, eine bessere Option, die mehrere Standardvariablen zulässt:
quelle
Dies ist eine Ableitung von Pablos Antwort. Auf diese Weise kann ich einen Standardwert ('full') festlegen, und am Ende wird 'mode' sowohl in local_assigns als auch in einer tatsächlichen lokalen Variablen festgelegt.
haml / schlank:
erb:
quelle
Intuitiver und kompakter:
<% some_local = default_value unless local_assigns[:some_local] %>
quelle
:locals => {:some_local => false}
Wenn Sie die lokale Variable nicht bei jedem Aufruf an partiell übergeben möchten, gehen Sie wie folgt vor:
Auf diese Weise vermeiden Sie
undefined variable
Fehler. Auf diese Weise können Sie Ihren Teil mit / ohne lokale Variablen aufrufen.quelle
Ruby 2.5
Erb
Es ist möglich, aber Sie müssen Ihre Standardwerte im Bereich deklarieren.
VARIABLE das Wort für Ersatz.
quelle
Ein Helfer kann so erstellt werden:
Implementiert wie:
In meinem Blog finden Sie Details dazu, wie und warum.
Beachten Sie, dass Sie mit dieser Lösung nil oder false als Wert übergeben können, ohne dass dieser überschrieben wird.
quelle