Rails多态简单表单集合选择 - 传递第二属性值

时间:2017-05-16 16:45:27

标签: ruby-on-rails simple-form

我有一个多态模型,sales_code sales_codeable_idsales_codeable_type是多态属性。相关模型为processorsplatforms

我正在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参数传递的最有效方法是什么?

1 个答案:

答案 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/