Rails: présélectionnez une valeur dans ActionView-Helper 'collection_select'
-
06-07-2019 - |
Question
J'essaie d'obtenir le ActionView-Helper collection_select
pour prendre une valeur qui sera présélectionnée dans le menu déroulant.
Ni l'un ni l'autre (: sélectionné
dans le hachage HTML d'option)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
nor (: sélectionné
dans l'option-hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
semble fonctionner.
Qu'est-ce que je fais mal? Quelqu'un peut-il m'aider à ce sujet?
La solution
Extrait du docs :
Exemple d'utilisation (sélection du Auteur
associé pour une instance de Post
, @post
):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
Si @ post.author_id
est déjà égal à 1, cela renvoie:
<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>
Vous devez donc simplement vous assurer que @ my_object.my_method
renvoie une valeur correspondant à l'une des valeurs d'option disponibles. S'il y a correspondance, cette option sera sélectionnée.
Autres conseils
Selon le docs , si @ my_object.my_method
a la même valeur que l'une des options, celle-ci sera sélectionnée par défaut.
Inversement, vous pouvez essayer d'utiliser options_from_collection_for_select
en association avec select_tag
:
<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
Utiliser : selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
Vérifiez si @ mon_objet.mon_méthode renvoie nil. Si c'est le cas,
Si la méthode appelante renvoie nil, aucune sélection n'est effectuée sans l'inclusion de: prompt ou: include_blank dans le hachage des options.
Sinon, vous pouvez essayer d'utiliser lambda, comme dans l'exemple rdoc
{:disabled => lambda {|category| category.archived? }
Dans votre cas, cela ressemblera à
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
Cela fonctionne également si votre collection se présente sous la forme d'un tableau de tableaux à 2 valeurs:
CURRENCIES = [["USD", "<*>quot;], ["BRL", "R<*>quot;]]
<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
Les astuces : first
et : last
fonctionnent assez bien pour ces choses-là, sans avoir à définir un modèle séparé pour elles.