2009-06-19 9 views
5

Estoy tratando de obtener el ActionView-Helper collection_select para tomar un valor que se preseleccionará en el menú desplegable.Rieles: Preseleccione un valor en ActionView-Helper 'collection_select'

Ni (:selected en el html-opción-hash)

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

ni (:selected en la opción-hash)

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

parecen funcionar.

¿Qué estoy haciendo mal? ¿Alguien puede ayudarme con esto?

Respuesta

8

Desde el docs:

Uso de muestra (seleccionando el Author asociado para una instancia de Post, @post):

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

Si @post.author_id ya es 1, esto sería volver:

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

lo que sólo tiene que asegurarse de que @my_object.my_method devuelve un valor que coincide con uno de los valores de las opciones disponibles. Si hay una coincidencia, entonces esa opción será seleccionada.

+0

Acepté esta respuesta, aunque me di cuenta de que tenía que cambiar de collection_select a select. Tenía dos selecciones de colecciones para elegir dos "publicaciones" diferentes.author_id "(usando el ejemplo de arriba) para poder compararlos en la página. Tenía un javascript-observer en cada una de esas collection_selects y no funcionaría porque collection_selects siempre muestra el siguiente html-element-id: post_author_id. Mi implementación no funciona porque el html-element-id de los dos collection_select es idéntico. – Javier

+0

Sí, el hecho de que Rails no garantiza identificadores únicos de elementos es un problema. –

2

De acuerdo con docs, si @my_object.my_method tiene el mismo valor que una de las opciones, esa será seleccionada por defecto.

Por el contrario, se podría tratar de usar options_from_collection_for_select conjuntamente con select_tag:

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

Comprobar si @ my_object.my_method devuelve nil. Si lo hace,

Si el método de llamada devuelve nulo, no se realiza ninguna selección sin incluir: prompt o: include_blank en el hash de opciones.

Aparte de eso, puede probar a usar lambda, como en el ejemplo rdoc

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

En el caso de que esto se verá como

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

Uso :selected_value

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

También funciona si su colección es en forma de una matriz de matrices 2-valor:

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

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

El truco :first y :last funciona bastante bien para estas cosas , sin tener que definir un modelo separado para ellos.

+0

No responde la pregunta sobre cómo seleccionar un cierto valor – Kelvin

Cuestiones relacionadas