2013-10-09 46 views
0

我有一個事件類型事件的選擇框。事件屬於event_type,event_type有很多事件。下面是我對選擇框:如何在軌道上正確使用紅寶石選擇框?

<%= f.select :event_type, options_from_collection_for_select(EventType.all, :id, :name, @event.id), :placeholder => 'Select an event type' %> 

但是,問題是,當我提交,其提交的事件類型的ID,而不是它的名稱。那麼,我將如何讓它提交名稱而不是ID?如果你需要看到更多的代碼,而不只是告訴我,謝謝

回答

1

的文檔可以使用的ID後提交加載事件類型再次在您的控制器後的動作是這樣的:

selected_type = EventType.find(params[:event_type] 

這也是一個很好的做法,以保持數據庫調用到控制器,所以請把EventType.all聲明那裏,它通過本地或類變量像你這樣做event

如果您確實想在您的表單中傳遞名稱而不是ID,則可以將您呼叫中的:id部分替換爲更類似options_from_collection_for_select(@event_types, :name, :name, @event.event_type.name)的東西。請記住,這個值應該是唯一的!

的方法是這樣的:

options_from_collection_for_select(collection, value_method, text_method, selected = nil) 

因此,第一個參數包含所有的選項,所述第二限定了被放入HTML選項的value領域那些選項對象中的值(其是由表單提交),第三個定義顯示給用戶的文本,最後一個參數定義選定條目的value(例如,如果您正在編輯條目)。對於最後一個參數,您需要使用事件的event_type id,或者在您的情況下使用名稱,因爲您將HTML標記的value設置爲它。

使用ApiDock或Rails教程等頁面來獲取這些方法的一些示例。 http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select

+0

感謝您的幫助!我會在創建操作中加入selected_type嗎? – Snubber

+0

selected_type實際上應該是你的事件的值之一,因爲你的事件應該知道它是什麼類型。它應該與event_type類有關係(分別使用'belongs_to'和'has_many'),所以你可以使用'@ event.event_type.id'來訪問它。如果這樣做了,那麼是的,在啓動事件對象或編輯時在創建動作中使用它。 – KappaNossi

+0

如果關係設置正確,請使用下面的代碼片段使您的生活更輕鬆:'<%= f.select:event_type_id,@ event_types.map {| t | [t.name,t.id]}%>'。這應該在編輯時自動選擇正確的選項,並且還使您能夠使用'Event.create(params [:event])'創建對象,包括動作中的關係。儘管如此,您仍然可以使用我帖子中的信息手動執行此操作。 – KappaNossi

2

options_from_collection_for_select的第二個參數是將與表單一起提交的值。您有:id,請將其更改爲:name

http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select

(不過這似乎是一個奇怪的事情 - 通常你會存儲事件類型ID)

+1

同意,通常你想存儲選擇框中的ID來堅持用戶的選擇到數據庫。如果您還需要該名稱,則可以始終使用該ID從數據庫中查找名稱。以這種方式做事情的一個原因是它允許您更改事件類型的名稱而不會搞亂現有記錄。 – sockmonk

1

你應該在數值方法通過名字,如果你想將名字傳下去,

<%= f.select :event_type, options_from_collection_for_select(EventType.all, :name, :name, @event.id), :placeholder => 'Select an event type' %> 

這裏是options_from_collection_for_select