Rails:如何让表单提交一系列记录?

时间:2011-06-02 22:42:05

标签: ruby-on-rails

我需要制作一个提交记录数组的表单。我正在使用rails 2.3.11并尝试按照这里的一对多部分中的说明进行操作:http://api.rubyonrails.org/v2.3.8/classes/ActionView/Helpers/FormHelper.html

但是当我这样做时,我会收到错误,或者表单只提交数组中的最后一条记录。

这不起作用,因为@query [:filters]是一个数组,所以fields_for会抛出异常:

  <% form_for :aquery, @query, :url => {:action => 'index'} do |a| %>
    <% a.fields_for :filters, @query[:filters] do |f| %>
      <p>
        <%= f.select :field, @fields %>
        <%= f.select :logic, ["all", "is", "is not", "none"]%>
        <%= f.text_field :arg, :size => 30 %>
      </p>
    <% end %>
    <%= submit_tag l(:button_apply) %>
  <% end %>

这不起作用,因为它忽略了@query [:filters]的内容,只渲染了一组字段,无论数组有多大:

    <% a.fields_for :filters do |f| %>

这不起作用,因为它只会提交数组中的最后一项:

<% form_for :aquery, @query, :url => {:action => 'index'} do |a| %>
  <% @query[:filters].each do |filter| %>
    <% a.fields_for :filters, filter do |f| %>
      <p>
        <%= f.select :field, @fields %>
        <%= f.select :logic, ["all", "is", "is not", "none"]%>
        <%= f.text_field :arg, :size => 30 %>
      </p>
    <% end %>
  <% end %>
  <%= submit_tag l(:button_apply) %>
<% end %>

1 个答案:

答案 0 :(得分:2)

您需要遍历过滤器并手动执行索引。

<% form_for :aquery, @query, :url => {:action => 'index'} do |a| %>
  <% @query[:filters].each_with_index do |filter, i| %>
    <% a.fields_for :filters, filter, :index => i do |f| %>
      <p>
        <%= f.select :field, @fields %>
        <%= f.select :logic, ["all", "is", "is not", "none"]%>
        <%= f.text_field :arg, :size => 30 %>
      </p>
    <% end %>
  <% end %>
  <%= submit_tag l(:button_apply) %>
<% end %>