Frage

Ich habe ein ziemlich alt Templatingsystem oben auf ERB geschrieben. Es stützt sich auf ERB-Vorlagen in der Datenbank gespeichert. Diejenigen, gelesen und wiedergegeben. Wenn ich möchte Daten zu übergeben von einer Schablone zu anderen benutze ich das: Einheimische Parameter Rails Methode machen. Standardvariablen diesen Variablen in einigen Vorlagen für die Einstellung Ich verwende das definiert? Verfahren, das sagt mir einfach, wenn die lokale Variable definiert worden ist, und wenn ich es nicht mit Standardwert wie folgt initialisiert werden:

unless defined?(perex)
  perex = true
end

Ich verbessere die App auf die neueste Rails und ich sehe einige seltsame Verhalten. Im Grunde ist dies manchmal funktioniert (manchmal Perex undefiniert) und manchmal nicht (Perex definiert ist und auf Null). Dies geschieht, ohne etwas anderen Wechsel.

Ich habe zwei Fragen: Gibt es einen besseren Weg, um andere als die Verwendung definiert? die unzuverlässig (seit einigen Jahren auf Rails 1.6 war zuverlässig) erweist? Eine solche Art und Weise sollte nicht dazu führen, mir alle Vorlagen neu zu schreiben. Ich habe durch Ruby-docs gegangen und war nicht in der Lage, etwas zu finden über definiert? Methode. War es veraltet oder bin ich einfach nur blind?

Edit: Die aktuelle Ausgabe von verursacht wurde, was scheint, ein Ruby / eRB Bug zu sein. Manchmal ist die es sei denn, Anweisung funktionieren würde, aber manchmal nicht. Das Seltsame ist, dass selbst wenn die zweite Zeile ausgeführt wurde Perex Stil Null auf den Rest der Welt geblieben. Entfernen definiert? beschlossen, dass.

War es hilfreich?

Lösung

Erstens: tatsächlich, defined? ist ein Operator <. / p>

Zweitens: Wenn ich Ihre Frage richtig verstanden hat, so, wie es zu tun ist, mit diesem Ruby-Idiom:

perex ||= true

Das wird zuweisen wahr perex wenn es nicht definiert oder nil ist. Es ist nicht genau das, was Ihr Beispiel der Fall ist, da bei Ihnen nicht die Zuordnung nicht auswertet, wenn der Wert nil ist, aber wenn Sie auf, dass dann setzen, meiner Meinung nach, ohne es zu sehen, sind Sie klar Code nicht geschrieben werden.

Bearbeiten : Wie Honza erwähnt, über die Anweisung den Wert von perex ersetzen, wenn es false ist. Dann schlage ich die folgenden die minimale Anzahl von Linien neu zu schreiben:

perex ||= perex.nil?  # Assign true only when perex is undefined or nil

Andere Tipps

Die sicherste Art und Weise der Prüfung, ob eine lokal in einer Rails-Vorlage definiert ist:

local_assigns[:perex]

Dies ist in dem Rails-API zusammen mit der Erklärung dokumentiert, dass defined? kann nicht wegen einer Implementierung Einschränkung verwendet werden.

Per mislav Antwort, ich suchte nach dieser Dokumentation in dem Rails-API, und fand es in Klasse ActionView :: Base (unter der Überschrift "Passing lokale Variablen Unter templates"). Es war kaum die Suche lohnt sich, obwohl, da es kaum etwas gesagt mehr als mislav tat. Abgesehen davon, dass es dieses Muster empfiehlt:

if local_assigns.has_key? :perex

Ange considerationg mislav ursprüngliche Antwort und KenB der Ausarbeitung , ich glaube, das folgende ist der absolut beste Ansatz (obwohl ich bin offen für Stellungnahme). Es nutzt Rubys Hash # holen Verfahren auf einem anderen Wert zu Rückfall, wenn der Schlüssel nicht in der ursprünglichen Hash existiert.

perex = local_assigns.fetch(:perex, true)

Das ist sogar besser als die ||= Methode, die die meisten Benutzer vorschlagen wird da manchmal wünschen Sie false Werte zu ermöglichen. Beispielsweise wird der folgende Code nie erlaubt ein false Wert übergeben werden:

perex = local_assigns[:perex] || true
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top