Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 为什么Rack(Rails)将这些表单post数据转换为两个单独的散列对象?_Html_Ruby On Rails_Forms_Rack_Url Parameters - Fatal编程技术网

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

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_

我正在尝试使用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_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)