2010-04-14 11 views
53

Ich habe ein jQuery-Skript, das ein neues Feld zu einem Formular hinzufügt, und dieses Feld enthält dynamische Informationen aus einem Array. Das Problem ist, dass ich nicht herausfinden kann, wie man ein Array.each fügt, um die Optionen des Auswahlfelds innerhalb des Javascript zu füllen, ohne den HAML-Einschnitt zu brechen und Fehler zu verursachen.Ruby-Methoden in Javascript in HAML

Hier ist mein bester Versuch, das nicht funktioniert:

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>); 
)}; 

auch versucht, es mit der: ohne Glück Javascript-Filter.

+0

Danke, sieht aus wie jemand das Markdown Einrückungsproblem für mich behoben. – Josh

Antwort

96

Normalerweise, wenn etwas in haml ist, bedeutet es, dass Sie das knifflige Bit zu einem Helfer oder teilweise umgestalten und das nennen sollten.

// some_helper.rb 
def new_snazzy_select_tag(options = []) 
    select_tag 'tag_name_here', options.map { |option| [option.id, option.name] } 
end 

Außerdem sollten Sie die :javascript Filter verwenden, Javascript zu machen, da sie es in einem Script-Tag für Sie zusammengestellt wird und Vertiefung ermöglichen.

Schließlich können Sie #{ruby_expression} überall in haml verwenden, einschließlich :javascript Filter, die sehr praktisch ist, wenn Sie das Ergebnis der Ruby-Ausdrücke an Stellen ausgeben müssen, die nicht direkt Inhalte von HTML-Elementen sind.

// some_view.html.haml 
:javascript 
    $('#mylink').click(function() { 
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}"); 
    }; 
+0

Ich bin ziemlich neu in der Entwicklung von Web-Apps, ich habe nie über einen Helfer nachgedacht. Ich habe meinen Code ziemlich nah an MVC gehalten, aber ich habe mich immer gefragt, wie ich die Schleifen umgehen kann, die ich in Ansichten brauche. Das sollte gut funktionieren. Danke für die Antwort. – Josh

+4

Helfer sind in der Regel zwischen Sicht und Controller. Sie sollten niemals den Zustand der Server-Seite ändern und sind einfach dazu da, * mit * ekliger View-Logik zu helfen. Ruby in Ihren Ansichten sollte so minimal wie möglich sein, um klar und wartbar zu sein. Helfer helfen dabei. –

+6

TL; DR ...? benutze # {ruby_expression} Danke Alex. – umassthrower

8

dies versucht, sollte es funktionieren (alles, was ich tat, war ein einzigen Platz in der fünften Zeile entfernen und den Schlusskurs am sechsten hinzufügen):

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - @myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>'); 
)}; 

Sie jedoch unter der Annahme, läuft dies mit einem Ruby-Skript oder Framework von Arten, warum nicht nur außerhalb der Vorlage tun? Das wäre wahrscheinlich am besten geeignet. In Rails/Sinatra und anderen Frameworks können Sie hierfür eine Hilfsmethode verwenden. Wenn Sie sich die haml-Referenz anschauen, raten sie tatsächlich davon ab, - zu verwenden, um Ruby zu bewerten.

+0

Ich tippte den Code aus dem Speicher ohne einen Syntax-Highlighter, sieht aus wie ich ein paar Fehler hatte. Ich kann im Moment nicht testen, aber ich glaube, das wird immer noch scheitern. Ich gehe auf die Helferroute, über die ich vorher noch nicht nachgedacht habe. Vielen Dank. – Josh

+0

Ich hatte zuvor den Code getestet, den ich in meiner Antwort in einer schnellen Sinatra-App eingegeben habe, und es schien gut zu funktionieren (keine haml-Fehler). Bist du sicher, dass der Fehler nicht woanders ist? Hier ist die generierte Ausgabe, die ich mit zufälligen Option-IDs und Namen erhalten habe: http://pastie.org/920686 – ehsanul