为什么Rack (Rails)将这些表单post数据转换为两个单独的Hash对象?



我现在正试图使用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_tagname的结构,但我不知道如何结构它们。

注意:我坚持使用这个更冗长的结构,因为Rails的StrongParams很糟糕。

在这种情况下,尝试使用accepts_nested_attributes_forfields_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)

最新更新