Html 为什么Rack(Rails)将这些表单post数据转换为两个单独的散列对象?
我正在尝试使用Rails构建一个复杂的HTML表单。由于表单比通常更复杂,我不使用Html 为什么Rack(Rails)将这些表单post数据转换为两个单独的散列对象?,html,ruby-on-rails,forms,rack,url-parameters,Html,Ruby On Rails,Forms,Rack,Url Parameters,我正在尝试使用Rails构建一个复杂的HTML表单。由于表单比通常更复杂,我不使用form\u来处理复杂的输入 以下是我遇到的问题: - users.each do |user| .checkbox = hidden_field_tag "booking[events][][id]", event.id = hidden_field_tag "booking[events][][delegates][][id]", user.id = label_
form\u来处理
复杂的输入
以下是我遇到的问题:
- users.each do |user|
.checkbox
= hidden_field_tag "booking[events][][id]", event.id
= hidden_field_tag "booking[events][][delegates][][id]", user.id
= label_tag "booking[events][][delegates][][attending]", for: id_for_event_bookings_checkbox(user, event) do
= check_box_tag "booking[events][][delegates][][attending]", 1, value_for_event_booking_checkbox(f.object, user, event), id: id_for_event_bookings_checkbox(user, event)
= user.name
供参考:
id_for_event_bookings_checkbox#=>“预订_form_#u checkbox#{user.id}#{event.id}”
活动预订复选框的值=>真/假
当我发布此表单时,参数的格式不正确
我得到的是:
{"booking"=> {"booker_id"=>"36", "events"=>[{"id"=>"2", "delegates"=>[{"id"=>"35", "attending"=>"1"}]}, {"id"=>"2", "delegates"=>[{"id"=>"36"}]}]}}
我需要的是:
{"booking"=> {"booker_id"=>"36", "events"=>[{"id"=>"2", "delegates"=>[{"id"=>"35", "attending"=>"1"}, {"id"=>"36"}]}]}}
我想我需要更改复选框标签的结构,但是我不知道它们的结构是什么
注意:我一直在使用这个更详细的结构,因为Rails的strong参数很糟糕。在这种情况下,请尝试使用
而不是与铁轨作战
class Booking < ActiveRecord::Base
accepts_nested_attributes_for :events
end
class Event
accepts_nested_attributes_for :delegates
end
请注意,这不会提供确切的所需参数,而是提供
使用约定的参数接受
的嵌套属性
{
booking: {
events_attributes: {
0 => {
id: 6
delegates_attributes: {
0 => {
id: 6
attending: 1
}
}
}
}
}
}
您可以通过以下方式将参数列为白名单:
ea = [:id, { delegates_attributes: [:id, :attending] } ]
params.require(:booking)
.permit(:booker_id, events_attibutes: ea)
如果委托是用户和事件之间的某种连接模型,则可以使用ActiveSupport[
delegate
]方法()或仅df.object.user.name
接受嵌套属性,因为这不是解决此问题的可行方法表单太复杂。但是谢谢:)我想说根本原因可能是糟糕的架构。你试图在一次行动中做很多事情。或者你做的水平不对。
ea = [:id, { delegates_attributes: [:id, :attending] } ]
params.require(:booking)
.permit(:booker_id, events_attibutes: ea)