Rotaie: preseleziona un valore in ActionView-Helper 'collection_select'
-
06-07-2019 - |
Domanda
Sto cercando di ottenere ActionView-Helper collection_select
per prendere un valore che sarà preselezionato nel menu a discesa.
Né (: selezionato
in html-option-hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
né (: selezionato
nell'opzione hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
sembra funzionare.
Cosa sto facendo di sbagliato? Qualcuno può aiutarmi su questo?
Soluzione
Dai docs :
Utilizzo di esempio (selezionando il Autore
associato per un'istanza di Post
, @post
):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
Se @ post.author_id
è già 1, questo restituirà:
<select name="post[author_id]">
<option value="">Please select</option>
<option value="1" selected="selected">D. Heinemeier Hansson</option>
<option value="2">D. Thomas</option>
<option value="3">M. Clark</option>
</select>
Quindi devi solo assicurarti che @ my_object.my_method
restituisca un valore che corrisponde a uno dei valori delle opzioni disponibili. Se c'è una corrispondenza, quell'opzione sarà selezionata.
Altri suggerimenti
Secondo i documenti , se @ my_object.my_method
ha lo stesso valore di una delle opzioni, quella verrà selezionata per impostazione predefinita.
Al contrario, potresti provare a utilizzare options_from_collection_for_select
in combinazione con select_tag
:
<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
Usa :selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
Verifica se @ my_object.my_method restituisce zero. In tal caso,
Se il metodo di chiamata restituisce zero, non viene effettuata alcuna selezione senza includere: prompt o: include_blank nell'hash delle opzioni.
Oltre a questo, puoi provare a usare lambda, come nell'esempio rdoc
{:disabled => lambda {|category| category.archived? }
Nel tuo caso sembrerà
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
Funziona anche se la tua collezione ha la forma di un array di array a 2 valori:
CURRENCIES = [["USD", "<*>quot;], ["BRL", "R<*>quot;]]
<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
Il trucco : first
e : last
funziona abbastanza bene per queste cose, senza dover definire un modello separato per loro.