【问题标题】:Rails Polymorphic Simple Form Collection Select - Pass Second Attribute ValueRails 多态简单表单集合选择 - 传递第二个属性值
【发布时间】:2017-05-17 01:02:43
【问题描述】:

我有一个名为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 参数传递的最有效方法是什么?

【问题讨论】:

    标签: ruby-on-rails simple-form


    【解决方案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/

    【讨论】:

    • 我最终使用了全局 id 的组合并通过控制器中的 parse 分配参数。感谢您为我指明正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多