Я бился головой о кирпичную стену, так что пришло время искать более умных людей.
Я пытаюсь создать несколько записей одной модели, используя 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| %>
[...]
@containers
. Если есть только один контейнер сparams[:container_ids]
, то инициализируется только одинcontainer_return
и передаются толькоparams
. - person Pavan   schedule 19.10.2018hidden_field_id: true
из fields_for? - person Getu   schedule 19.10.2018'returns[]'
на'container_returns[]'
внутриfields_for
- person Pavan   schedule 19.10.2018fields_for
на<%= fields_for container_return do |cr| %>
? - person Vasilisa   schedule 19.10.2018hidden_field_id: true
ничего не делает. Можете ли вы предоставить нам информацию о моделях, которые вы используете? - person Getu   schedule 19.10.2018