2010-11-19 18 views
1

Mehrere meiner Teiltöne können in zwei "Modi" gerendert werden. Wenn full_displayfalse ist, gebe ich mehrere Felder nicht aus. Um die Dinge einfach zu machen, wollte ich einen der "Modi" Standard machen - wenn full_display nicht definiert ist, behandeln Sie es als false. Ich kam mit diesem Code:Dynamische Oszilloskop-Helfer in Rails machen

(((not defined?(full_display).nil?) && full_display) || false) 

Ziemlich viel zu bewegen. Es wäre schön, es in einen Helfer oder so zu stecken, aber da Ruby nur einen lexikalischen Umfang hat, kann ich mir keinen guten Weg vorstellen.

Bad Ideen, die ich bereits versucht habe:

  • auf der Oberseite des Teils tun <% display = long code that is above %> und Anzeige durch den Code verwenden, aber in Hinblick auf lokale Variablen Erstellen sieht schlecht aus und hat in jedem kopiert werden teilweise mit full_display.
  • wickeln Sie es in eine Zeichenfolge, legen Sie es in einen Helfer und verwenden Sie eval (display_helper) in der Ansicht, aber das erzeugt natürlich Sicherheitsbedenken.

Antwort

2

Das ist ein ziemlich gewundenen Weg, um etwas so einfach zu sagen wie:

defined?(full_display) && full_display 

In Ruby gibt es zwei Werte, die nicht wahr sind, nil und false bewerten alle anderen als wahr, die 0 enthält B. leere Zeichenfolge, die sonst in Perl, PHP und C als falsch bewertet würde. Das Testen mit .nil? ist normalerweise für die seltenen Fälle reserviert, in denen zwischen false und undefined unterschieden werden soll, was manchmal bei booleschen Feldern der Fall ist Ein fehlender Wert unterscheidet sich von einem falschen Wert.

<% full_display ||= false %> 

Das entspricht full_display = full_display || false: die oder-gleich mit dem Operator ||= wie diese

in jedem Fall in der Ansicht Raum ist es viel einfacher Standardwerte zuweisen. Das macht zwei Dinge. Erstens definiert es die full_display Variable, selbst wenn es nicht zuvor erstellt wurde, und zweitens stellt es sicher, dass es einen Wert enthält, der mindestens false ist, niemals undefiniert.

Sie werden die ||= default Muster viel in Ruby-Code sehen, da es eine einfache Möglichkeit ist, etwas in dem Fall zuzuweisen, wo es sonst nil sein wird.

+0

Das ist viel besser als mein Code, danke! Es wäre sogar noch besser (und leistungsfähiger), dynamische Helfer zu haben. –

Verwandte Themen