我有一个事件类型的选择框。 event属于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?如果您需要查看更多代码而不仅仅是告诉我,谢谢
答案 0 :(得分:2)
options_from_collection_for_select
的第二个参数是随表单提交的值。您有:id
,因此请将其更改为:name
。
http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select
(但这似乎很奇怪 - 通常你会存储事件类型ID。)
答案 1 :(得分:1)
如果要传递名称,则应在Value方法中传递名称
<%= f.select :event_type, options_from_collection_for_select(EventType.all, :name, :name, @event.id), :placeholder => 'Select an event type' %>
的文档
答案 2 :(得分: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