2016-11-04 1 views
1

In meinem Ruby on Rails 4 app (2.2 Rubin), i in einer Ansicht haben:Factorize Ruby-Skript auf Basis konstanter Array-Schleife

<%= sanitize(@template.render(
            'text1' => modal['text1'], 
            'text2' => modal['text2'], 
            'text3' => modal['text3'], 
            'text4' => modal['text4'], 
            'image1' => modal['image1'], 
            'image2' => modal['image2'], 
            'image3' => modal['image3'] 
            goes on like this.... 
) 
           ) %> 

Wo sehen Sie oben 'geht so auf', es ist, weil ich woukd mag diese faktorisieren und dirctly von dieser konstante kommenden Werte verwenden:

MODAL_ELEMENTS = [ "text1", 
         "text2", 
         "text3", 
         "text4", 
         "image1", 
         "image2", 
         "image3", 
         "video1", 
         "video2", 
         "video3", 
         "..." 
           ] 

ich möchte einen Weg finden, zu ändern, was in sanieren ist @ template.render so dass Rubin jeder der MODAL_ELEMENTS Artikel (text1, text2 Schleifen durch , ..) und injiziere sie wie 'text1' => 'text1' => modal ['text1'], 'text2' => modal ['te xt1 '] auf den obigen Code.

Heute habe ich dies aber es funktioniert nicht:

<%= sanitize(@template.render(
        MODAL_ELEMENTS.each { |element| element => modal[ element ])) %> 

Die Schwierigkeit ist auch, dass die Schleife jedes Koma hinzufügen hat („“), die wir hier in fett sehen:

‚text1‘ => modal [ 'text1'] ,

'text2' => modal [ 'text2'] ,

...

+0

Was genau sind Sie mit, dies zu erreichen versuchen? – SomeSchmo

Antwort

1

Wenn es nur diese Zeichenfolge Sie wollen und diese Zeichenfolge ausgewertet wird später dann würde dieser Code

tun
MODAL_ELEMENTS.map{ |element| "'#{element}' => modal[ '#{element}' ]"}.join(", ") 
+0

Gibt es da nicht sme Dinge wie die Schließung der}? – Mathieu

1

Sie Angenommen, haben ein Hash namens modal und @template.render erwartet auch einen Hash:

MODAL_ELEMENTS.each_with_object({}){ |element, memo| memo[element] = modal[element] } 

#each verwendet, wird nicht ausgegeben nichts. Dieses Array wird verarbeitet, gibt aber kein anderes Array zurück. Wenn Sie erwarten, dass etwas zurückgegeben wird, sollten Sie #map verwenden. Dies wird ein Array basierend auf Ihrem Eingabe-Array zurückgeben.

Mit #inject oder #each_with_object können Sie eine Enumerable verarbeiten und wird nicht auf die Ausgabe eines Arrays beschränkt sein. In diesem Beispiel wird ein Hash ausgegeben.

+0

danke für Ihre Hilfe. Die Sache ist, ich möchte weder einen Hash noch ein Array ausgeben. Wie Sie in der Frage sehen, möchte ich nur ausgeben: 'text1' => modal ['text1'], 'text2' => modales ['text2'], 'text3' => modal ['text3'] , 'text4' => modal ['text4'], .. es gibt kein Array noch Hash – Mathieu

+0

Oh .. Sie wollten eine Zeichenfolge ausgeben. Ich denke @peter hat dann die richtige Antwort. –

+0

interessante Antwort, es hat mich dazu gebracht, über die Leistung zwischen each_object vs vs inject vs jedem ... http: //engineering-blog.alphasights.com/tap-inject-and-each_with_object/#performance – Mathieu