Rails: предварительно выбрать значение в ActionView-Helper 'collection_select' - PullRequest
5 голосов
/ 19 июня 2009

Я пытаюсь заставить ActionView-Helper collection_select принять значение, которое будет предварительно выбрано в выпадающем меню.

Ни то, ни другое (:selected в html-option-hash)

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

nor (:selected в опциональном хэше)

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

похоже на работу.

Что я делаю не так? Может ли кто-нибудь помочь мне в этом?

Ответы [ 5 ]

8 голосов
/ 19 июня 2009

Из документов :

Пример использования (выбор связанного Author для экземпляра Post, @post):

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

Если @post.author_id уже равен 1, возвращается:

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

Так что вам просто нужно убедиться, что @my_object.my_method возвращает значение, соответствующее одному из доступных значений параметра. Если есть совпадение, будет выбран этот вариант.

2 голосов
/ 19 июня 2009

В соответствии с документами , если @my_object.my_method имеет то же значение, что и один из параметров, этот будет выбран по умолчанию.

И наоборот, вы можете попробовать использовать options_from_collection_for_select в сочетании с select_tag:

<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
1 голос
/ 24 августа 2009

Использование :selected_value

%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
0 голосов
/ 17 июля 2011

Это также работает, если ваша коллекция представлена ​​в виде массива из двухзначных массивов:

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

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

Трюк :first и :last прекрасно работает для этих вещей, без необходимости определения отдельной модели для них.

0 голосов
/ 19 июня 2009

Проверьте, возвращает ли @ my_object.my_method ноль. Если это так,

Если вызывающий метод возвращает nil, выбор не производится без включения: prompt или: include_blank в хэш параметров.

Кроме этого, вы можете попробовать использовать лямбду, как в примере с rdoc

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

В вашем случае это будет выглядеть как

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