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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top