Сложная вложенность форм в Rails - Как создать желаемый вывод параметров хеш / массива

Я пытаюсь понять, как правильно обрабатывать хэш параметров, чтобы не передавать параметры, которые должны быть вложены несколько раз...

Вот упрощенный (удаленная ненужная информация, такая как ярлыки и т. Д.) Моего кода html.slim (с использованием simple_form):

= f.simple_fields_for :room do |r|
    - (1..4).each do |room|
      = r.input 'adults',:collection => 1..4,:input_html => {:name => "room[adults][]"}
      = r.input 'children',:collection => 0..2,:input_html => {:name => "room[children][]"}
      - (1..2).each do |child|
        = r.input 'child_age',:input_html => {:name => "children[#{child}][ages][]"}

хорошо это с входами 1 комната, 1 взрослый, 1 ребенок 5 лет, мы получаем такие параметры:

"room"=>{"adults"=>["1", "1", "1", "1"], "children"=>["1", "0"]}, "children"=>{"1"=>{"ages"=>["5", ""]}, "2"=>{"ages"=>["", ""]}}

что я на самом деле хочу иметь в параметрах это:

"room"=>{"adults"=>["1", "1", "1", "1"], "children"=>["1"=>["5",""], "0"=>["",""]] }

Кто-нибудь есть идеи о том, как это сделать?

1 ответ

Решение

Извини я не знаю как simple_form работает, но вот как я бы сделал это с нормальным rails хелперы.

<%= f.fields_for :rooms, (rooms_collection) do |r| %>
  ... # Any inputs you may want
  <%= r.fields_for :children, (children_collection) do |c| %>
    <%= c.text_field :child_age %>

Это не даст вам точный вклад, который вы хотите, но это даст вам что-то вроде

"room"=>{"adults"=>["1", "1", "1", "1"], "children"=>{"0"=>{child_age => ["5",""]}, "1"=>{child_age => ["",""]}}}

Кроме того, если у вас нет постоянных объектов, это должно работать

<%= f.fields_for :rooms do |r| %>
  ... # Any inputs you may want
  (1..2).each do
  <%= r.fields_for :children do |c| %>
    <%= c.text_field :child_age %>
Другие вопросы по тегам