ruby-on-rails Rails窗体select返回对象中的所有参数

9fkzdhlc  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(127)

我的控制器中有一个列表,看起来像:

@relatives = [
    {
        id: '1',
        firstName: 'John',
        lastName: 'Smith',
        related: 'Father'
    },
    {
        id: '2',
        firstName: 'Sarah',
        lastName: 'Smith',
        related: 'Mother'
    }
]

字符串
我想把这个列表中的一个形式选择在我的看法。因此,它将是一个relatives的下拉列表,但它只显示select中的firstName字段。当用户选择一个对象并提交表单时,* 整个 * 相对对象将通过参数传递给控制器。
我正在研究rails collection_select API,但不知道如何在表单中选择整个对象。

baubqpgj

baubqpgj1#

好了,所以我决定完成这一点的最好方法是在我的控制器中创建一个散列,键是显示文本,值是我对象的JSON表示。
控制器:

@relatives = {
    "John" => "{id: 1, firstName: 'John', lastName: 'Smith', related: 'Father'}",
    "Sarah" => "{id: 2, firstName: 'Sarah', lastName: 'Smith', related: 'Mother'}"
}

字符串
然后在我看来,我将使用options_for_select:

f.select :relative, options_for_select(@relatives)


当用户选择一个值并提交表单时,JSON字符串将在参数中作为值返回。从控制器中,我将把JSON转换回模型。谢谢大家的帮助。

pkmbmrz7

pkmbmrz72#

Rails 7的答案

它可能也适用于其他版本,因为我刚刚使用Rails 7。

<%= form.collection_radio_buttons :address, @addresses, :to_json, :label %>

字符串
由于为idvalue提供的:符号实际上调用了对象提供的任何内容,因此可以提供对象列表并直接使用to_json方法。
这将把address对象的所有属性作为json字符串添加到params中。正如@32clemons已经提到的,你必须将它转换回控制器。
PS:我的地址对象:

{
id: null --> it's a new object and not provided jet,
label: string --> a full description of the address,
city: string,
....
}


:label也可以被定义为模型中的一个函数,作为地址对象的其他属性的组合,但在我的例子中,它是我用来检查地址的API(HERE Maps)的返回值。

相关问题