Rieles: preseleccione un valor en ActionView-Helper 'collection_select'
-
06-07-2019 - |
Pregunta
Estoy tratando de obtener el ActionView-Helper collection_select
para tomar un valor que se preseleccionará en el menú desplegable.
Ninguno (: seleccionado
en html-option-hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
nor (: seleccionado
en la opción-hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
parece funcionar.
¿Qué estoy haciendo mal? ¿Alguien me puede ayudar en este?
Solución
Del documentos :
Ejemplo de uso (seleccionando el Autor
asociado para una instancia de Publicar
, @post
):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
Si @ post.author_id
ya es 1, esto devolvería:
<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>
Por lo tanto, solo debe asegurarse de que @ my_object.my_method
devuelva un valor que coincida con uno de los valores de opción disponibles. Si hay una coincidencia, se seleccionará esa opción.
Otros consejos
De acuerdo con el docs , if @ my_object.my_method
tiene el mismo valor que una de las opciones, esa se seleccionará de forma predeterminada.
Por el contrario, puede intentar usar options_from_collection_for_select
junto con select_tag
:
<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
Use :selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
Verifique si @ my_object.my_method devuelve nil. Si es así,
Si el método de llamada devuelve nil, no se realiza ninguna selección sin incluir: prompt o: include_blank en el hash de opciones.
Aparte de eso, puedes intentar usar lambda, como en el ejemplo de rdoc
{:disabled => lambda {|category| category.archived? }
En su caso, esto se verá
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
También funciona si su colección tiene la forma de una matriz de matrices de 2 valores:
CURRENCIES = [["USD", "<*>quot;], ["BRL", "R<*>quot;]]
<%= 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 ellas.