我认为相当简单的模型设置:
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
这不太有帮助。
我也尝试过其他的变化,但我觉得在这一点上我只是在黑暗中感觉自己。任何指导将不胜感激!
答案 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