Форма Rails с вложенными атрибутами в has_many через отношение

Я пытаюсь создать форму с несколькими вложенными объектами в отношении has_many :through. Однако при сохранении вложенным объектам, по-видимому, не назначается внешний_ключ родительского объекта. Я не уверен, что я делаю неправильно здесь.

# app/models/admin/host.rb
class Admin::Host < ApplicationRecord
  has_many :admin_host_users, class_name: 'Admin::HostUser', foreign_key: 'admin_host_id', dependent: :destroy
  has_many :users, through: :admin_host_users

  accepts_nested_attributes_for(:admin_host_users, allow_destroy: true)

# app/models/admin/host_user.rb
class Admin::HostUser < ApplicationRecord
  belongs_to :admin_host, class_name: 'Admin::Host'
  belongs_to :user

# app/models/user.rb
class User < ApplicationRecord
  has_many :admin_host_users, class_name: 'Admin::HostUser'
  has_many :admin_hosts, through: :admin_host_users

# app/controllers/hosts_controller.rb
class HostsController < ApplicationController
  def create
    @host = Admin::Host.new(admin_host_params.merge(status: :pending))
    @host.save!
  end

  def new
    @host = Admin::Host.new
    @admin_host_users = [@host.admin_host_users.build(user: current_user)]
  end

  private
  
  def admin_host_params
    params.require(:admin_host).permit(
      :name,
      admin_host_users_attributes: [
        :user_id,
        :role,
      ],
    )
  end

# app/views/hosts/_form.html.erb
<%= form_with(model: @host, url: hosts_path, local: true) do |f| %>
  <% @admin_host_users.each do |admin_host_user| %>
    <%= f.fields_for(:admin_host_users, admin_host_user) do |admin_host_user_form| %>
      <%= admin_host_user_form.select(:user_id, @all_users) %>

Хорошо, это код. Вот ответ при отправке формы:

Started POST "/hosts" for ::1 at 2021-05-23 08:45:22 -0400
Processing by HostsController#create as HTML
  Parameters: {"utf8"=>"✓", "admin_host"=>{"name"=>"Test", "admin_host_users_attributes"=>{"0"=>{"user_id"=>"1"}}}, "commit"=>"Apply Now"}

Completed 422 Unprocessable Entity in 287ms (ActiveRecord: 42.5ms)

ActiveRecord::RecordInvalid (Validation failed: Admin host users admin host must exist):
  
app/controllers/hosts_controller.rb:10:in `create'

person Tony Beninate    schedule 23.05.2021    source источник
comment
Может ли быть что-то связанное с отсутствующим inverse_of в модели соединения append_to? thoughtbot.com/blog/   -  person Joel Blum    schedule 23.05.2021
comment
@Joel_Blum Sheesh, отличная находка, вот и все! Спасибо большое   -  person Tony Beninate    schedule 24.05.2021
comment
Да, это довольно обман, определенно не интуитивный. Не за что   -  person Joel Blum    schedule 24.05.2021
comment
@Joel_Blum не стесняйтесь создавать ответ, чтобы я мог принять; я чувствую, что это может быть полезно для других (или... меня) в будущем.   -  person Tony Beninate    schedule 24.05.2021


Ответы (1)


Попробуйте установить параметр inverse_of для has_many ассоциации

  has_many :admin_host_users, class_name: 'Admin::HostUser', foreign_key: 'admin_host_id', dependent: :destroy, inverse_of: 'Admin::Host'
  has_many :users, through: :admin_host_users, inverse_of: 'Admin::Host'
person Joel Blum    schedule 24.05.2021
comment
Ссылка на статью, которой вы поделились ранее: thoughtbot.com/blog / - person Tony Beninate; 24.05.2021