2009-06-19 41 views
5

我試圖讓ActionView-Helper collection_select獲取將在下拉菜單中預選的值。Rails:在ActionView-Helper'collection_select'中預選一個值

無論(:selected在HTML選項哈希)

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

也不

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

似乎工作。

我在做什麼錯?任何人都可以幫我解決這個問題嗎?

回答

8

docs

示例使用情況(選擇關聯的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返回匹配的可用選項值的一個值。如果有匹配,那麼將選擇該選項。

+0

我接受了這個答案,但我只是注意到,我不得不從collection_select切換到選擇。我有兩個收集選擇,以選擇兩個不同的「職位。author_id「(使用上面的例子),所以我可以在頁面上比較它們。我在每個collection_select上都有一個javascript-observer,它不起作用,因爲collection_selects總是輸出下面的html-element-id:post_author_id。不起作用,因爲兩個collection_select的html-element-id是相同的 – Javier 2009-06-22 09:03:17

+0

是的,Rails不保證唯一元素ID的事實有點問題 – 2009-06-30 19:11:21

2

根據docs,如果@my_object.my_method與其中一個選項具有相同的值,那麼將默認選擇該選項。

相反,你可以嘗試結合使用options_from_collection_for_selectselect_tag

<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %> 
0

檢查@ my_object.my_method返回零。如果是,

如果調用方法返回nil,則在選項散列中不包含:prompt或include_blank時不進行選擇。

除此之外,你可以嘗試使用lambda,就像在RDoc的例子

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

在你的情況,這將像

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

使用:selected_value

%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %> 
-1

它也可以,如果你的收集是在2值數組的數組形式:

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

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

:first:last招工作很好地爲這些事情而不必爲它們定義單獨的模型。