我想创建一个具有嵌套属性的表单,该表单在富连接表中填充记录。 (在富连接表中创建的记录当然应该有适当的外键。)
我还没有找到关于在has_many :through
关系上创建嵌套表单字段的完整答案。请帮忙!
对于此示例,我有一个用户表单。在该表单中,我还尝试在users_pets
表(富连接表)中填充记录。
附加问题:丰富的连接模型应该是单数还是复数?示例:app/models/owners_pets.rb
或app/models/owners_pet.rb
。
应用程序/模型/ owner.rb
class Owner < ActiveRecord::Base
has_many :owners_pets, allow_destroy: true
has_many :pets, through: :owners_pets
end
应用程序/模型/ pet.rb
class Pet < ActiveRecord::Base
has_many :owners_pets, allow_destroy: true
has_many :owners, through: :owners_pets
end
应用程序/模型/ owners_pets.rb
class OwnersPet < ActiveRecord::Base
belongs_to :owners
belongs_to :pets
end
应用程序/控制器/ owners.rb
def owner_params
params.require(:owner).permit(:first_name, owners_pets_attributes: [:id, :pet_name, :pet_id])
end
应用程序/视图/所有者/ _form.html.erb
<%= simple_form_for(@owner) do |f| %>
<%= f.input :first_name %>
<%= f.simple_fields_for :owners_pets do |ff|
<%= ff.input :pet_name %>
<% end %>
<div>
<%= f.button :submit %>
</div>
<% end %>
答案 0 :(得分:3)
这是答案,感谢导师的一堆帮助。它有助于我记住,丰富的连接命名约定不应该在最后复数,就像其他非富连接模型一样。例如:book_page.rb
NOT books_pages.rb.
即使books_page.rb
也可以工作(只需相应地更新您的强参数和数据库表)。重要的是整个模型必须遵循模型的轨道惯例是单数的(最后没有')。
在富连接模型下面,我决定将其命名为完全奇异的版本:owner_pet.rb
,而不是其他版本:owners_pet.rb
。 (当然,我的数据库表名为:owner_pets
)
<强> 应用程序/模型/ owner.rb 强>
class Owner < ActiveRecord::Base
has_many :owner_pets
has_many :pets, through: :owner_pets
accepts_nested_attributes_for :owner_pets, allow_destroy: true
end
<强> 应用程序/模型/ pet.rb 强>
class Pet < ActiveRecord::Base
has_many :owner_pets
has_many :owners, through: :owner_pets
end
<强> 应用程序/模型/ owner_pet.rb 强>
class OwnerPet < ActiveRecord::Base
belongs_to :owner
belongs_to :pet
end
<强> 应用程序/控制器/ owners.rb 强>
def new
@owner = Owner.new
@owner.owner_pets.build
end
private
def owner_params
params.require(:owner).permit(:first_name, owner_pets_attributes: [:_destroy, :id, :pet_name, :pet_id, :owner_id])
end
<强> 应用程序/视图/所有者/ _form.html.erb 强>
<%= simple_form_for(@owner) do |f| %>
<%= f.input :first_name %>
<%= f.simple_fields_for :owner_pets do |ff| %>
<%= ff.input :pet_name %>
<%= ff.input :pet_id, collection: Pet.all, label_method: "pet_type" %>
<% end %>
<div>
<%= f.button :submit %>
</div>
<% end %>
答案 1 :(得分:1)
您的联接表是问题所在:
联接表应该belongs_to :owners belongs_to :pets
此外,富连接模型应该是复数形式,如:owners_pets