Rails 5 fields_for отправляет только последние параметры

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

Я пытаюсь создать несколько записей одной модели, используя form_tag и fields_for. Я следил за всеми справками/проблемами/руководствами, которые я мог найти, но, похоже, это не работает для меня. Мне интересно, изменилось ли что-то при переходе на Rails 5, но, скорее всего, это я.

По сути, мне нужна новая/созданная версия системы задач, указанная в нижней части страница API, похожая на создатель этого щенка.

«Новая» страница загружается нормально с любым количеством записей, так что эта часть в порядке, но, похоже, она не создает коллекцию для отправки, она просто переопределяет и, таким образом, отправляет последний набор параметров, поэтому только создание одной записи.

Что я имею.

# routes
resources :container_returns

контроллер

# container returns controller
def new
  @containers = Container.where(id: params[:container_ids])
  @container_returns = []
  @containers.each do |container|
    @container_returns << ContainerReturn.new(
      {
        container_id: container.id,
        quantity: container.amount,
        uom: container.uom,
        material_restriction_id: container.material_restriction_id
      }
    )
  end  
end

Посмотреть

# new.html.erb
<%= form_tag container_returns_path, method: :post do %>

  <% @container_returns.each do |container_return| %>
    <%= fields_for 'returns[]', container_return, hidden_field_id: true do |cr| %>

      <div class="field">
        <%= cr.label :container_id %>
        <%= cr.number_field :container_id %>
      </div>

      <div class="field">
        <%= cr.label :material_restriction_id %>
        <%= cr.number_field :material_restriction_id %>
      </div>

      <div class="field">
        <%= cr.label :quantity %>
        <%= cr.text_field :quantity %>
      </div>

      <div class="field">
        <%= cr.label :uom %>
        <%= cr.text_field :uom %>
      </div>

    <% end %>        
  <% end %>

  <%= submit_tag "lots of returns" %>

<% end %>

который представляет

# params submitted
Started POST "/container_returns" for 127.0.0.1 at 2018-10-19 11:00:48 +0200
Processing by ContainerReturnsController#create as HTML
Parameters: {
  "utf8"=>"✓", "authenticity_token"=>[removed],
  "returns"=>{"container_id"=>"405", "material_restriction_id"=>"", "quantity"=>"100.0", "uom"=>"kg"}, "commit"=>"lots of returns"
}

надеюсь, это просто какая-то глупость, которую я пропустил.

ОБНОВЛЕНИЕ: если я добавлю индекс в форму, теперь он считает, что мои объекты разные, и отправляет все нужные мне параметры.

<% @container_returns.each_with_index do |container_return, index| %>
  <%= fields_for 'returns[]', container_return, index: index do |cr| %>
  [...]

person theduxinlux    schedule 19.10.2018    source источник
comment
Проверьте размер @containers. Если есть только один контейнер с params[:container_ids], то инициализируется только один container_return и передаются только params.   -  person Pavan    schedule 19.10.2018
comment
Привет, в моем тесте у меня есть 4 контейнера, каждый из которых отображается в новой форме. Так что все есть, так что это не проблема.   -  person theduxinlux    schedule 19.10.2018
comment
это что-нибудь изменит, если вы удалите hidden_field_id: true из fields_for?   -  person Getu    schedule 19.10.2018
comment
Хорошо, попробуйте изменить 'returns[]' на 'container_returns[]' внутри fields_for   -  person Pavan    schedule 19.10.2018
comment
Что если изменить fields_for на <%= fields_for container_return do |cr| %>?   -  person Vasilisa    schedule 19.10.2018
comment
hidden_field_id: true ничего не делает. Можете ли вы предоставить нам информацию о моделях, которые вы используете?   -  person Getu    schedule 19.10.2018
comment
раньше это было container_returns[], но в конечном итоге это просто имя параметра для коллекции, поэтому не должно иметь значения, как оно называется. Это не исправило, вернув его обратно. Изъятие параметра коллекции просто возвращает его к одному коммиту, так что там тоже ничего нет. hidden_field_id нужен, если я хочу отредактировать несколько позже. Существует только одна модель, и эта форма должна просто отправлять информацию для создания нескольких ее экземпляров.   -  person theduxinlux    schedule 19.10.2018
comment
Итак, если id добавит идентификатор к моему объекту, он будет работать так, как я ожидал. Я предполагаю, что ему что-то не нравится в объекте ContainerReturn.new, имеющем нулевой идентификатор.   -  person theduxinlux    schedule 19.10.2018


Ответы (1)


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

<% @container_returns.each_with_index do |container_return, index| %>
  <%= fields_for 'returns[]', container_return, index: index do |cr| %>
  [...]

дает мне то, что я ожидал

Parameters: {
  "returns"=>{"0"=>{"container_id"=>"400",...},
              "1"=>{"container_id"=>"401",...},
              etc.
             },
  "commit"=>"lots of returns"
}
person theduxinlux    schedule 19.10.2018