2009-06-19 10 views
5

Sto provando a ottenere il valore ActionView-Helper collection_select in modo che venga preselezionato nel menu a discesa.: Preselezionare un valore in ActionView-Helper 'collection_select'

Né (:selected in html-opzione-hash)

<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %> 

né (:selected nell'opzione-hash)

<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %> 

sembrano funzionare.

Cosa sto sbagliando? Qualcuno può aiutarmi su questo?

risposta

8

Dal docs:

Esempio di utilizzo (selezionando l'associato Author per un'istanza di Post, @post):

collection_select(:post, :author_id, Author.all, :id, :name_with_initial) 

Se @post.author_id è già 1, questo sarebbero tornati:

<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 basta fare in modo che @my_object.my_method restituisce un valore che corrisponde a uno dei valori di opzione a disposizione. Se c'è una corrispondenza, quell'opzione sarà selezionata.

+0

Ho accettato questa risposta, anche se ho appena notato che dovevo passare da collection_select per selezionare. Ho avuto due selezioni di raccolta per scegliere due diversi "post.author_id "(usando l'esempio sopra) in modo da poterli confrontare sulla pagina.Ho avuto un javascript-observer su ciascuno di questi collection_select e non funzionerebbe perché collection_selects emette sempre il seguente id-elemento html: post_author_id. La mia implementazione non funziona perché l'id dell'elemento html dei due collection_select è identico – Javier

+0

Sì, il fatto che Rails non garantisca ID di elementi univoci è un po 'un problema. –

2

In base allo docs, se @my_object.my_method ha lo stesso valore di una delle opzioni, quella sarà selezionata per impostazione predefinita.

Al contrario, si potrebbe provare a utilizzare options_from_collection_for_select in collaborazione con select_tag:

<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %> 
0

Verificare @ my_object.my_method restituisce zero. Se lo fa,

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, si può provare a utilizzare lambda, come nell'esempio rdoc

{:disabled => lambda {|category| category.archived? } 

Nel tuo caso questo sarà simile

{:selected => lambda {|obj| obj.id == @my_collection_object.id }} 
1

Usa :selected_value

%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %> 
-1

Funziona anche se la raccolta è sotto forma di un array di array 2-valore:

CURRENCIES = [["USD", "$"], ["BRL", "R$"]] 

<%= collection_select :thing, :currency, CURRENCIES, :first, :last %> 

Il :first e :last trucco funziona abbastanza bene per queste cose , senza dover definire un modello separato per loro.

+0

Non risponde alla domanda su come selezionare un certo valore – Kelvin

Problemi correlati