15

ビューに 2 つのドロップダウンがあり、最初のドロップダウンから選択した値に基づいて 2 番目のドロップダウン オプションを更新しようとしています。

このトピックに関する Railscast は知っていますが、グループ化されたコレクションは使用したくありません。これの主な理由は、ユーザーがいずれかのドロップダウンから選択でき、それに応じて結果がフィルター処理され、2 番目のドロップダウンは、最初のドロップダウンの値が選択されたときにのみそのオプションをフィルター処理するためです。

私の質問は、js.erb ファイルから select_tag オプションを再入力するにはどうすればよいですか?

  <%= form_tag("filter", :id => "filter_form", :method => "post") do %>
      <label for="company_id" class="company">Company</label><%= select_tag(:company_id, options_from_collection_for_select(Company.all.order(:name), :id, :name), :prompt => "All Companies") %>
      <label for="product_id" class="product">Product</label><%= select_tag(:product_id, options_from_collection_for_select(Product.all.order(:name), :id, :name), :prompt => "All Products") %>
  <% end %>

js.コーヒー

  $('#company_id').change( ->
    sendFilterForm()
  )

sendFilterForm = ->
  $.get($('#filter_form').attr('action'), $('#filter_form').serialize(), 'script')

コントローラ

@filterProducts = true
@products = Product.where(company_id: params[:company_id]).order(:name)

js.erb

<% if @filterProducts  %>
    $('#product_id').html(<%= options_from_collection_for_select(@products, :id, :name) %>);
<% end %>

ですから、最後の部分は明らかにかなり間違っていますが、それが私がやろうとしていることのコンセプトです。これを達成する適切な方法は何ですか?必要に応じて、これを作り直すことができます。助けていただければ幸いです。

4

1 に答える 1

24

escape_javascriptエスケープ キャリア リターン、によって生成される一重引用符と二重引用符を追加しますoptions_from_collection_for_select

への呼び出しを追加する以外に、他に問題はありませんescape_javascriptjs.erbで次のことを試してください:

<% if @filterProducts  %>
    $('#product_id').html("<%= escape_javascript options_from_collection_for_select(@products, :id, :name) %>");
<% end %>
于 2013-07-10T15:51:31.340 に答える