Rails: Wert in ActionView-Helper 'collection_select' Preselect
-
06-07-2019 - |
Frage
Ich versuche, die ActionView-Helper collection_select
einen Wert zu nehmen, die in dem Dropdown-Menü vorgewählt werden.
Weder (:selected
im html-Option-Hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
oder (:selected
in der Option-Hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
zu funktionieren scheint.
Was mache ich falsch? Kann jemand mir auf diesem helfen?
Lösung
Von der docs :
Probenverbrauch (den zugehörigen Author
für eine Instanz von Post
Auswahl @post
):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
Wenn @post.author_id
bereits 1 ist, würde dies zurück:
<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>
Also Sie müssen nur sicherstellen, dass @my_object.my_method
einen Wert zurückgibt, die eine der verfügbaren Optionswert übereinstimmt. Wenn es ein Spiel dann wird diese Option gewählt werden.
Andere Tipps
Nach dem docs , wenn @my_object.my_method
das hat derselbe Wert wie eine der Optionen, wird das eine standardmäßig ausgewählt werden.
Im Gegensatz dazu könnten Sie versuchen, mit options_from_collection_for_select
in Verbindung mit select_tag
:
<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
Verwenden :selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
Überprüfen Sie, ob @ my_object.my_method null zurückgibt. Ist dies der Fall,
Wenn Aufruf der Methode null zurückgibt, wird keine Auswahl getroffen, ohne einschließlich: Prompt oder: include_blank in der Hash-Optionen.
Other than that, können Sie versuchen, Lambda verwenden, wie in dem Beispiel rdoc
{:disabled => lambda {|category| category.archived? }
In Ihrem Fall wird dies wie folgt aussehen
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
Es funktioniert auch, wenn Sie Ihre Sammlung in Form einer Reihe von 2-Wert-Arrays ist:
CURRENCIES = [["USD", "$"], ["BRL", "R$"]]
<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
Die :first
und :last
Trick funktioniert ganz gut für diese Dinge, ohne für sie ein separates Modell definieren zu müssen.