Rails 5.2 ассоциации и формы - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть модели Владелец, Pet:

  • Владелец: has_many: домашние животные
  • Домашнее животное: принадлежит_ владельцу.

Очень стандартно. В маршрутах у меня есть

Rails.application.routes.draw do
  resources :owners do
    resources :pets
  end
end

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

<%= form_with(model: [@owner, pet], local: true) do |form| %>
<%= form_with(url: [@owner, pet], local: true) do |form| %>
<%= form_with(model: @owner, url: [@owner, pet], local: true) do |form| %>

И в каждом случае owner_id заканчивается на неправильном «уровне»:

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"sDU1E/rdnRbl/7iXwWSo1mV4ABqgrdIl0HylmLSKvrnEzPUsU+seHaDZeFuZVb6MdBfVNHR7Wgzqmv/7XgMNGQ==", 
 "pet"=>{"name"=>"King Smith", "age"=>"12", "breed"=>"Foo"}, 
 "commit"=>"Create Pet", "owner_id"=>"2"}

Я думал, до 5.2, первый подход был верным. Вы видите, где я иду не так?

1 Ответ

0 голосов
/ 01 ноября 2018

Поскольку вы используете опцию local: true в form_with , форма отправляется через обычный POST-запрос, а не XHR. Так почему бы не использовать form_for вместо:

<%= form_for [@owner, @pet] do |form| %>

Для form_with синтаксис будет:

<%= form_with(model: [@owner, @pet], local: true) do |form| %>

Обратите внимание на использование переменной экземпляра @pet вместо локальной pet, как в вашем вопросе. @pet должен быть инициализирован в контроллере, например, в действии new, как

 @pet = @owner.pets.build

и при обработке в create действии:

 @pet = @owner.pets.build(pet_params)
 if (@pet.save)
   ...

Кроме того, меня не заботит «уровень» вашего owner_id параметра, из-за вложенных ресурсов . pets ресурс вложен в owners. При отправке формы с новым питомцем запрос POST отправляется на URL-адрес, который выглядит примерно так: /owners/OWNER_ID/pets (который определяется помощником формы, form_for или form_with, в приведенных выше примерах). Rails-маршрутизатор будет соответствовать этому запросу, вызовите действие create из PetsController и установите params[:owner_id] в OWNER_ID. Так что это идет не от данных вашей формы, а от маршрутизатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...