使用simple_form Rails的Rich Join Table的嵌套属性

时间:2015-01-15 23:56:21

标签: ruby-on-rails many-to-many simple-form nested-forms

我想创建一个具有嵌套属性的表单,该表单在富连接表中填充记录。 (在富连接表中创建的记录当然应该有适当的外键。)

我还没有找到关于在has_many :through关系上创建嵌套表单字段的完整答案。请帮忙!

对于此示例,我有一个用户表单。在该表单中,我还尝试在users_pets表(富连接表)中填充记录。

附加问题:丰富的连接模型应该是单数还是复数?示例:app/models/owners_pets.rbapp/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 %>

2 个答案:

答案 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