2016-07-14 5 views
1

Ich verwende select_tag und onchange. Ich brauche einen Helfer-Methode aufrufen und den Wert des ausgewählten Elements als Parameter übergeben:Javascript Variable innerhalb verwenden <% %> in erb - Ruby on Rails

Dies ist, wie mein Helfer-Methode wie

def find_template(temp) 
    "Hello #{temp}!" 
end 

sieht Was muss ich tun ist, die Auswahl des Benutzers zu erhalten, unter Verwendung von Javascript, und übergeben Sie es an find_template. Wenn ich eine Zeichenfolge anstelle von Vorlage übergeben, es funktioniert gut, also <% @header = find_template("option_1") %> aber wenn ich var template verwenden bekomme ich folgende Fehlermeldung:

undefined local variable or method `template' for ... 

und das ist mein erb

<% content_for :javascript do %> 
    <script> 
     function template() { 
      var e = document.getElementById("category"); 
      var template = e.options[e.selectedIndex].text; 
      <% @header = find_template(template) %> 
     } 
    </script> 
<% end %> 

<%= select_tag(:category, options_for_select(
       Blah::TYPES.map {|k, v| [v['name'], k] }), 
       {onChange: 'template()'}) %> 

<div id="template-overview"> 
    <table> 
     <tr> 
      <% @header.each do |column| %> 
       <th class="<%= cycle('even', 'odd') -%>"> 
        <%= column %> 
       </th> 
      <% end %> 
     </tr> 
    </table> 
</div> 
+0

Sie kein Javascript innerhalb von Ruby verwenden können. Ruby ist Serverseite. Javascript ist Client-Seite. Um eine solche Variable zu übergeben, müssen Sie eine AJAX-Anfrage stellen. http://blog.teamtreehouse.com/i-dont-speak-your-language-frontend-vs-backend – Cfreak

+0

Wenn Ihre Seite geladen wird, generiert Rails HTML, JS, CSS usw. und füttert es dann auf dem Server. Der Code ändert den Inhalt der Seite nicht, ohne die Seite neu zu laden. Wenn Sie möchten, dass sich Ihr Inhalt ändert, suchen Sie besser nach einer Möglichkeit, mit JS den Inhalt Ihrer Seite dynamisch zu ändern, ohne eine Rails-Funktion aufrufen zu müssen. – Okomikeruko

+0

Das liegt daran, dass der Servercode vor dem Clientcode ausgeführt wird, daher ist die Variable nicht definiert. Verwende AJAX. – PHPglue

Antwort

1

gelöst: Der richtige Weg tun, um es ist ajax zu verwenden:

in Ihrem page.erb

<% content_for :javascript do %> 
    <script> 
     $(document).ready(function(){ 
      $("#category").change(function(){ 
       var temp_name = $('#category').val(); 
       $.ajax({ 
        url: "/YOUR_PATH/"+temp_name, 
        dataType: "html", 
        type: "GET", 
        data: {ANY_DATA: VALUES}, 
        success: function(data){ 
         jQuery("#template_overview").html(data); 
        } 
       }); 
      }); 
     }); 
    </script> 
<% end %> 

<div id="template_overview"> 
</div> 

haben teilweise die Ihre div

im Controller auffüllt:

def display_template 
    . 
    . 
    . 
    . 
    render partial: '/PATH/template_overview', header: @header 
end 

und natürlich die Routen

get 'controller/display_template/:temp_id' => 'controller#display_template' 
+0

Verwenden Sie keine Zitatsyntax für etwas, das kein Zitat ist. –

+0

was meinst du? –

+0

Das '>' Markup, das Sie in Ihrer Frage/Antwort verwendet haben. Es ist reserviert für Zitate zu dekorieren. –