2016-07-14 2 views
1

私はselect_tagonchangeを使用しています。私は、ヘルパーメソッドを呼び出し、パラメータとして選択した項目の値を渡す必要があります。erbで<% %>のjavascript変数を使用する - Ruby on Rails

これは私のヘルパーメソッドを使用して、私は何をする必要があることは、ユーザーの選択を取得することです

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

どのように見えるかですjavascriptを開き、find_templateに渡します。私が代わりにテンプレートの文字列を渡すと、それはすなわち<% @header = find_template("option_1") %>、正常に動作しますが、私はvar templateを使用するとき、私は次のエラーを取得:

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

をし、これが解決

<% 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

あなたがルビーの内側にはJavaScriptを使用することはできません:あなたのdivのコントローラで

移入している部分があります。 Rubyはサーバー側です。 Javascriptはクライアント側です。そのような変数を渡すには、AJAXリクエストを行う必要があります。 http://blog.teamtreehouse.com/i-dont-speak-your-language-frontend-vs-backend – Cfreak

+0

あなたのページが読み込まれると、RailsはHTML、JS、CSSなどを生成し、それをサーバーに送ります。 Railsコードは、ページをリロードせずにページの内容を変更しません。コンテンツを変更したい場合は、JSを使用してRails関数を呼び出さずにページのコンテンツを動的に変更する方法を見つける方がよいでしょう。 – Okomikeruko

+0

クライアントコードの前にサーバーコードが実行されるため、変数は未定義です。 AJAXを使用します。 – PHPglue

答えて

1

私ERBです:正しい方法それにやっていることは、AJAXを使用することです:あなた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> 
def display_template 
    . 
    . 
    . 
    . 
    render partial: '/PATH/template_overview', header: @header 
end 

そしてもちろんのルート

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

引用符ではないものに対して引用構文を使用しないでください。 –

+0

どういう意味ですか? –

+0

あなたの質問/回答で使用した '> 'マークアップ。引用符を飾るために予約されています。 –

関連する問題