在一个“提交”按钮(Ruby)中发送多个表单(编辑多个对象)

时间:2015-11-26 15:42:24

标签: html ruby-on-rails ruby forms

我有很多对象(客户)填充表格,我需要为每一行/客户编辑特定字段(通过单选按钮),并通过表格底部的单个提交按钮保存所有字段。

我认为最好为每一行(“accept_reject_form”)呈现一个表单,其中我有两个单选按钮,但我无法弄清楚如何在提交时使用表单为每个单元保存每个选项客户。

我花了一些时间看一些类似的问题,但没有一个能解决这个问题。任何帮助将不胜感激: - )

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Available Actions</th>
    </tr>
  </thead>
  <tbody>
    <% @customers.each do |customer| %>
      <tr>
        <th><%= customer.name %></th>
        <th><%= customer.age %></th>  
        <th><%= render 'accept_reject_form' %></th>
      </tr>
    <% end %>  
  </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

您不需要每行一个表单:每个表单生成一个请求,这非常低效。相反,表单提交的数据需要以这样的方式构建,即控制器操作只需查看params的内容即可更新多个记录。

我会确保在accept_reject_form部分内,您拥有表单标记,并且只有字段。 form标签应该围绕你遍历@customer的块包裹:在这种情况下,它需要绕过整个表。

为表单中的每个字段分配一个名称值,如

"customers[#{customer.id}][first_name]"
"customers[#{customer.id}][last_name]"

然后这将转到控制器,如

params = {:customers => {123 => {:first_name => "John", :last_name => "Smith"}, 456 => {:first_name => "Susan", :last_name => "Thompson"}}

然后在控制器中(例如更新操作),您可以执行以下操作:

if params[:customer] && params[:id]
  #traditional params structure for updating a single record
  @customer = Customer.find_by_id(params[:id])
  @customer.update_attributes(params[:customer])
elsif params[:customers] #note plural
  #new params structure for updating multiple records
  @customers = []
  params[:customers].each do |id, attrs|
    customer = Customer.find_by_id(id)
    customer.update_attributes(attrs)
    @customers << customer
  end
end

这可能会使用一些错误检查,但您希望得到这个想法。