2013-07-10 7 views
11

Ho due elenchi a discesa in una vista e sto tentando di aggiornare le seconde opzioni a discesa in base al valore selezionato dal primo elenco a discesa.Aggiornamento selezionare il tag dinamicamente con ajax nei binari

Sono a conoscenza dei Railscasts su questo argomento, ma non voglio utilizzare le raccolte raggruppate; Le ragioni di ciò sono principalmente che l'utente può selezionare da un menu a discesa o l'altro e i risultati vengono filtrati di conseguenza, il secondo menu a discesa solo filtra le sue opzioni quando viene selezionato un valore dal primo elenco a discesa.

La mia domanda è, come posso ri-popolare le opzioni select_tag da un file js.erb?

forma

<%= 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.coffee

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

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

controllore

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

Così l'ultima parte è ovviamente del tutto sbagliato, ma che è il concetto di ciò che sto cercando di fare. Qual è il modo corretto per realizzare questo? Sono aperto a rielaborare questo, se necessario, ogni aiuto è apprezzato.

+0

Avete un repository github con questo? Forse per Rails 4? –

risposta

18

Aggiungi escape_javascript per restituire i ritorni della compagnia aerea, virgolette singole e doppie generate da options_from_collection_for_select.

Non vedo altri problemi tranne l'aggiunta di una chiamata a escape_javascript. Si prega di provare quanto segue nel js.erb:

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

Wow. Come ho trascurato questo :-) Inoltre, era necessario avvolgere la chiamata ruby ​​incorporata tra virgolette all'interno di html(). Grazie! – Drew

+0

@Drew, Sì, ecco, ho aggiornato la mia risposta aggiungendo virgolette. – vee

+0

Hai un repository github con questo? Forse per Rails 4? –