我现在正试图使用Rails构建一个复杂的HTML表单。由于表单比通常更复杂,我不使用form_for
来处理棘手的输入。
这是我遇到麻烦的部分:
- 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 # => " booking_form__checkbox_ # {user.id} _ # {event.id}"
value_for_event_booking_checkbox # => true/false
当我发布这个表单时,参数是错误的。
结果:
{"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"}]}]}}
我认为我需要改变the check_box_tag
和name
的结构,但我不知道如何结构它们。
注意:我坚持使用这个更冗长的结构,因为Rails的StrongParams很糟糕。
在这种情况下,尝试使用accepts_nested_attributes_for
和fields_for
代替战斗Rails。
class Booking < ActiveRecord::Base
accepts_nested_attributes_for :events
end
class Event
accepts_nested_attributes_for :delegates
end
使用form_for和fields_for生成字段实际上非常简单:
= form_for(@booking) do |f|
= f.hidden_field :booker_id
= f.fields_for :events do |ef|
= ef.fields_for :delegates do |df|
= df.label :attending do
= df.check_box :attending
# assumes the delegate is a user
= df.object.name
注意,这不会给你想要的确切参数,而是给你您的参数与accepts_nested_attributes_for
的约定。
{
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)