从Rails表单中获取数组

时间:2012-02-06 05:08:42

标签: ruby-on-rails ruby ruby-on-rails-3

我需要为account资源设计一个表单。在那种形式中,我需要在名为params的属性relationships哈希中收集一些id作为数组。

因此,POST请求中的最终params[account]哈希应该是:

{:name => 'somename', :relationships => ["123", "23", "23445"]}

我该如何设计form_for字段?我尝试了这个,但没有用:

<%= form_for @account do |f| %>
    <%= f.text_field :name %>

    <% @eligible_parents.each do |p| %>
        <%= f.check_box "relationships", nil, :value => p.id  %>
        <b><%= p.name %></b><br/>
      </span>
    <% end %>

    <%= f.submit "Submit" %>
<% end %>

@eligible_parents中的元素数量每次都有所不同。

relationships既不是account模型中的关联也不是属性。

我必须使用虚拟属性,但我需要从表单填写一个数组。

请帮忙。我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:6)

您的视图中仍然需要fields_for,只需使用:relationships作为record_name,然后提供一个对象。

<%= form_for @account do |f| %>
    <%= f.text_field :name %>

    <% fields_for :relationships, @eligible_parents do |p| %>
        <%= p.check_box "relationships", nil, :value => p.object.id  %>
        <b><%= p.object.name %></b><br/>
    <% end %>

    <%= f.submit "Submit" %>
<% end %>

此处的文档:ActionView::Helpers::FormHelper

答案 1 :(得分:2)

如果要发送值数组,只需在名称属性中使用[]。在您的情况下,只需使用

<%= f.check_box "relationships", {}, :value => p.id, :name => "relationships[]"   %>

答案 2 :(得分:2)

我发现这是最干净的方式......

如果您正在处理直接数据,并希望在不使用任何@objects的情况下发回数组:

<%= form_for :team do |t| %>
  <%= t.fields_for 'people[]', [] do |p| %>
    First Name: <%= p.text_field :first_name %>
    Last Name: <%= p.text_field :last_name %>
  <% end %>
<% end %>

你的params数据应该像这样返回:

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}

答案 3 :(得分:0)

在具有嵌套属性的复杂形式中,可以使用f.object_name帮助器。但是在进行插值时要注意语法。这是正确的:

"#{f.object_name}[relationships][]"

这是不正确的:

"#{f.object_name}[relationships[]]"

它总是让我绊倒。

答案 4 :(得分:0)

我正在从事类似的工作。我的问题是如何使用rails form_for帮助器将输入名称传递给部分名称,以将其解析为哈希。

所以,我的解决方案是这样的:

= render 'my_partial', form: form, name: "item_ids[item.id]"

所以,这将呈现一个这样的html:

<input class="form-control" name="products[items_ids[1]]" id="products_items_ids[1]">

数字1item.id,这就是HTML理解您将要传递数组或哈希的方式,所有这些都取决于您的配置。

所以,参数看起来像这样:

"items_ids"=>{"1"=>"1"}

这对我来说form_object + virtus

有效