Rails - 在同一页面上提交多个表单

时间:2014-02-03 17:19:45

标签: ruby-on-rails forms

模型: 用户有费用。费用有一个状态。

查看: 当用户添加费用时,它们会显示在列表中。每个费用行末尾都有一个表单按钮,用于提交费用(更改费用状态)。这允许用户添加他们尚未完全填写的费用,并在他们准备好时提交。此页面上没有父表单,只有表单按钮将费用提交给更改状态的方法,然后重新加载页面。

目前效果很好,但用户要求只需一个按钮即可“提交所有”在视图上显示的费用。

问题: 在rails中处理这个问题的正确方法是什么?我应该找到一种方法来收集费用ID的数组,然后提交一份单独的表格吗?有没有办法要求在具有特定状态的视图中显示一组记录?

谢谢!

4 个答案:

答案 0 :(得分:4)

另一个选择,如果我正在考虑这个问题(很大的话),那就是用User形式包装你的页面。然后你就可以拥有类似......

<%= form_for(@user) do |f| %>
  <% @user.expenses.each do |expense| %>
    <% f.fields_for expense do |e| %>
      <!-- expense form -->
    <% end %>
  <% end >
<% end %>

这是您可以整体提交的内容。我无法想象一下单一费用增加的情况,但希望这会让你在未来的路上走得更远。

编辑:除了在页面上显示此User表单外,您还可以拥有&#34;额外&#34; Expense表单以创建费用。当您提交新费用时,该费用将显示在用户表单下的列表中,可以在其中编辑或提交,作为组的一部分或单独(作为&#34;组&#34; 1的一部分)

答案 1 :(得分:2)

自定义控制器操作:

def update_all_expense_statuses
  expenses = current_user.expenses
  ExpenseUpdater.new(expenses).update_expense
  redirect_to :back
end

费用更新程序类:

class ExpenseUpdater
  def initialize(expenses)
     @expenses = expenses
  end

  def update_expense
    @expenses.each do |expense|
      expense.update_attributes(status: 'paid')
      expense.save
    end
  end
end

这只是使用自定义控制器操作更新所有用户费用的一种方法的示例。只需从link_to调用控制器方法:

<%= link_to "Update all expenses", update_all_expense_statuses_path %>

请记住将其添加到您的路线中。希望这会有所帮助。

答案 2 :(得分:1)

您应该做的第一件事是更改表单以远程提交,即发出ajax请求。然后你没有重新加载整个页面。查看Rails的各种“远程”表单助手,例如“remote_form_for”。

然后,编写一个javascript函数来提交自页面加载以来已更改的输入的所有表单。您可能希望在每个输入的onchange事件中向父表单添加“已更改”(或类似)类,以便于此操作。我认为这是处理您所询问的“状态”事物的最佳方式。制作一个“全部提交”按钮,调用此功能。

答案 3 :(得分:0)