【问题标题】:Rails - Submit multiple forms on same pageRails - 在同一页面上提交多个表单
【发布时间】:2014-02-03 17:19:44
【问题描述】:

型号: 用户有费用。费用是有状态的。

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

目前它运行良好,但用户要求能够通过单个按钮“提交”视图上显示的所有费用。

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    如果我正在考虑这个权利(如果),另一个选择是将您的页面包装在 User 表单中。然后你可以有类似的东西......

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

    这是您可以整体提交的内容。我无法想象单笔费用增加的样子,但希望这能让你走得更远。

    编辑:除了在页面上有这个User 表单之外,您还可以有一个“额外的”Expense 表单来创建费用。当您提交新费用时,该费用会显示在用户表单下的列表中,可以在其中编辑或提交,可以作为组的一部分或单独(作为 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 %>
    

    记得将它添加到您的路线中。希望这会有所帮助。

    【讨论】:

    • 非常好,我要添加一些过滤器,但这绝对是一种方法。谢谢!
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,我会调查的。我希望避免使用 javascript,除非它是唯一的选择。
    • 如果您想避免使用 javascript,您仍然可以尝试使用 params 哈希和自定义方法制定解决方案。不知道收集所有的forms参数有多难。
    • 您可以更改表单,以便将所有费用输入封装在一个表单中,并且用户一次提交所有更改。您需要按照 riecaro2 的建议编写自定义控制器方法。构建数据的一个好方法是提交一个散列,其中键是费用对象的 id,每个都指向属性散列以更新该对象。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多