2012-04-02 8 views
1

Ich habe diesen Code in einer .html.erb Datei:Rails: Zugriff auf Instanzvariablen aus nicht JS Inline

<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> 
<script> 
    FB.Event.subscribe('edge.create', 
     function(response) { 
      send_fb_like(); 
     } 
); 
    FB.Event.subscribe('edge.remove', 
     function(response) { 
      send_fb_unlike(); 
     } 
); 
    function send_fb_like() 
    { 
    var business_name = '<%= @consumer.name %>'; 
    alert("You liked"+consumer_name); 
    } 
    function send_fb_unlike() 
    { 
    var business_name = '<%= @consumer.name %>'; 
    alert("You unliked"+consumer_name); 
    } 

</script> 

Dies ist korrekt funktioniert, und ich kann die @ consumer.name Zugriff richtig . Allerdings, wenn ich dies zu ändern:

Wo facebook_consumer.js sieht wie folgt aus:

$(function(){ 

FB.Event.subscribe('edge.create', 
      function(response) { 
       send_fb_like(); 
      } 
    ); 
     FB.Event.subscribe('edge.remove', 
      function(response) { 
       send_fb_unlike(); 
      } 
    ); 
     function send_fb_like() 
     { 
     var business_name = '<%= @consumer.name %>'; 
     alert("You liked"+consumer_name); 
     } 
     function send_fb_unlike() 
     { 
     var business_name = '<%= @consumer.name %>'; 
     alert("You unliked"+consumer_name); 
     } 


}); 

Es wird speichern:

Sie mochte <%= @consumer.name %>. Ich habe versucht, die Datei als js.erb zu speichern, aber dann scheint es nicht zu wissen, was @consumer ist.

Irgendwelche Gedanken darüber, was der beste Ansatz ist?

+0

Manchmal erstelle ich einen Hash auf dem Markup wie diese einige Werte zu setzen, so dass die Javascript von der Referenz * Datei * wird in der Lage sein .. zugreifen Ich weiß nicht wirklich, ob dies eine gute oder schlechte Idee tho – MilkyWayJoe

Antwort

2

Ihre beste Wette besteht wahrscheinlich darin, ein app-weites JS-Objekt zu erstellen, um die von Ihnen benötigten Werte zu speichern. Oben auf der Seite können Sie Elemente zu diesem Objekt hinzufügen und diese stehen für Ihre verknüpften Skripts zur Verfügung.

<script type="text/javascript"> 
    app = app || {} 
    app.keyName1 = "<%= @variable1 %>"; 
    app.keyName2 = "<%= @variable2 %>"; 
</script> 
+0

Wie würde ich auf die Attribute von @variable zugreifen? Ich habe versucht @ Variable.to_json.html_safe, aber ich bekomme immer undefiniert, obwohl ich das Json-Objekt in der Konsole sehen kann. –

+0

ist '@ variable' ein Array? Wenn dies der Fall ist, müssen Sie es irgendwie durchlaufen und dem app-Objekt Schlüssel und Werte zuweisen. Nicht sehr elegant, ich gebe es zu. –

+0

Variable ist ein Objekt aus einem Modell. In der Konsole kann ich nach der Ausführung von to_json (Variable = @ Variable.to_json) das Objekt als {"key": "Attribut", ...} sehen, aber ich versuche mit Variable.key zuzugreifen und ich bekomme undefiniert> (. –

1

Sie können Ruby-Code nicht in .js-Dateien einfügen. Wenn Sie Ruby-Code verwenden möchten, müssen Sie eine .js.erb-Datei erstellen und dann einen Teil davon rendern.

# controller 
render :partial => "/path/to/js/partial.js.erb" 

# inside your JS partial 
# you can use <%= @consumer.name %> freely in this file 
# and then add the line below to render your normal html.erb file 
$("#reviews").append("<%= escape_javascript(render(:partial => '/path/to/partial.html.erb')) %>"); 
Verwandte Themen