我有一个多态模型,sales_code
sales_codeable_id
,sales_codeable_type
是多态属性。相关模型为processors
和platforms
。
我正在sales_code_controller
中生成一系列处理器/ paltforms,如下所示:
@processorsPlatformsArray = Processor.order(:name, 'id asc').map{|p| [p.name, p.id, p.class.name]}
@processorsPlatformsArray += Platform.order(:name, 'id asc').map{|p| [p.name, p.id, p.class.name]}
在我用于创建新销售代码的表单(简单表单)中,我有以下输入:
= f.input :sales_codeable_id, collection: @processorsPlatformsArray, label: "Processor/Platform:", required: :true
当我从下拉列表中选择处理器/平台时,它成功地将相应的sales_codeable_id传递到我的表格参数中。但是,提交表单会引发错误,因为没有为sales_codeable_type传递值(显然需要)。将所选处理器/平台的类名作为sales_codeable_type参数传递的最有效方法是什么?
答案 0 :(得分:1)
没有JavaScript:您可以使用输入上的value_method
选项构造一个类似于object_type|id
的值,然后在控制器中手动解析该参数
使用JavaScript:为表单添加sales_codeable_type
的隐藏输入。在重新发送集合时,使用该选项的销售代码类型为每个选项添加HTML数据属性。所以它最终看起来像:
<option value="1" data-type="Processor">Processor 1</option>
向选择项添加更改处理程序,该选择项使用所选选项的data-type
属性填充隐藏字段。
在任何一种情况下,控制器都应该将类型值列入白名单,验证它们是两个已批准值之一。
我尚未尝试的第三种方法是使用GlobalId
来查找关联对象,如下所示:http://stefan.haflidason.com/simpler-polymorphic-selects-in-rails-4-with-global-id/