在Rails

时间:2016-11-21 03:11:39

标签: ruby-on-rails ruby forms

我认为相当简单的模型设置:

class Booking < ApplicationRecord
  has_many :payments
end
class Payment < ApplicationRecord
  belongs_to :booking
end

现在,我想创建一个允许用户批量注册付款的表单。也就是说,表单应该有多个输入行,每个输入行代表某些预订的付款(即,每行包含Payment列的一些字段加上{{1 }}}。提交后,每一行都应该创建一个相应的booking_id,该Payment应该与用户为该行指示的Booking相关联。

这似乎非常棘手,我的Google-Fu让我失望了。我尝试了以下内容(受this帖子的启发,描述了一个没有关联的解决方案),我认为这样可行,但是,嗯,不是:

class Admin::PaymentController < Admin::Controller
  def batch
    @payments = []
    5.times do
      @payments << Payment.new
    end
  end

  def submit
    params["payments"].each do |payment|
      if payment["booking_id"] != "" || payment["amount"] != ""
        Payment.create(payment_params(payment))
      end
    end
  end

  private
  def payment_params(p)
    p.permit(:booking_id, :amount)
  end
end
<%= form_tag admin_payment_submit_path do %>
  <% @payments.each do |payment| %>
    <%= fields_for 'payments[]', payment do |p| %>
      <%=p.text_field :booking_id%>
      <%=p.number_field :amount%>
    <% end %>
  <% end %>
<%= submit_tag %>
<% end %>

这会使表单呈现而不会出错,但HTML名称可以确保只提交一次付款(最后一次)(例如name="payments[booking_id]")。此外,提交后,我收到错误

undefined method `permit' for "booking_id":String Did you mean? print

这不太有帮助。

我也尝试过其他的变化,但我觉得在这一点上我只是在黑暗中感觉自己。任何指导将不胜感激!

1 个答案:

答案 0 :(得分:1)

控制器中的

params是具有ActiveController::Parameter方法的permit实例 但是params["payments"]是一个正数数组作为参数的子集。

对于多个付款参数

def submit
  payment_params.each do |payment|
    if payment["booking_id"].present? || payment["amount"].present?
      Payment.create(payment)
    end
  end
end

private

def payment_params
  params.permit(payments: [:booking_id, :amount])["payments"]
end

对于单一付款参数

def submit
  if payment_param["booking_id"].present? || payment_param["amount"].present?
    Payment.create(payment_param)
  end
end

private
def payment_param
  params.require(:payments).permit(:a, :b)
end