0

我有一个事件类型的选择框。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?如果您需要查看更多代码,而不仅仅是告诉我,谢谢

4

3 回答 3

2

第二个参数 tooptions_from_collection_for_select是将与表单一起提交的值。你有:id,所以把它改成:name.

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

(但这似乎是一件奇怪的事情——通常你会存储事件类型 ID。)

于 2013-10-09T13:24:26.523 回答
1

You should pass name in the Value method, if you want to pass the name,

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

Here is the doc for options_from_collection_for_select

于 2013-10-09T13:26:08.787 回答
1

您可以在提交后使用 id 在控制器发布操作中再次加载事件类型,如下所示:

selected_type = EventType.find(params[:event_type]

保持对控制器的数据库调用也是一个好习惯,所以请把EventType.all语句放在那里,并将它作为本地或类变量传递,就像你对event.

如果您真的想在表单中传递名称而不是 id,则可以将:id调用中的部分替换为类似 this的部分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)

因此,第一个参数包含所有选项,第二个参数定义了这些选项对象中的值,这些选项对象被放入valueHTML 选项(由表单提交)的字段中,第三个定义了显示给用户的文本和最后一个参数定义value所选条目的 (例如,如果您正在编辑条目)。对于最后一个参数,您需要使用事件的 event_type id,或者在您的情况下使用名称,因为您将valueHTML 标记的 设置为它。

使用 ApiDock 或 Rails 教程等页面获取其中一些方法的示例。 http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select

于 2013-10-09T13:28:21.893 回答