Ruby on rails 如何使用复选框使用嵌套表单创建多个记录

Ruby on rails 如何使用复选框使用嵌套表单创建多个记录,ruby-on-rails,Ruby On Rails,我有一个比萨模型和一个比萨顶面连接表的顶面模型。比萨饼有很多配料,配料属于比萨饼。我是Rails的新手 我的问题是试图理解如何创建一个嵌套表单,将多条记录添加到PizzaTopping联接表中。我还需要浇头以复选框形式显示 <div class="form-horizontal"> <%= form_for(@pizza) do |f| %> 或困惑#2: 这是一个嵌套表单,但是如何从Topping模型中获取toppings复选框,以及与上面相同的,如何在控制

我有一个比萨模型和一个比萨顶面连接表的顶面模型。比萨饼有很多配料,配料属于比萨饼。我是Rails的新手

我的问题是试图理解如何创建一个嵌套表单,将多条记录添加到PizzaTopping联接表中。我还需要浇头以复选框形式显示

<div class="form-horizontal">
  <%= form_for(@pizza) do |f| %>


或困惑#2:

这是一个嵌套表单,但是如何从Topping模型中获取toppings复选框,以及与上面相同的,如何在控制器中对其进行编码以在联接表中添加记录

<div class="form-group">
  <%= f.fields_for :toppings do |builder| %>
    <%= builder.check_box %> // confused what I would even do next

  <% end %>
</div>

//不知道我下一步会做什么


首先,如果您使用的是联接表,那么您需要以不同的方式组织您的关系,使用具有“属于”关系的联接表是没有意义的,您要做的是组织您的关系,以便比萨饼有多个:浇头,浇头有多个:比萨饼,并使用through::Pizza\u toppings键

现在谈谈你的第一个困惑, 如果您正在使用复选框,那么您最希望收到的是该复选框的值,最有可能是id,这取决于您在拥有id数组后实例化记录,可能是沿着
selected\u toppings=Topping.where(id:params[:Topping\u ids])
将实例化所选浇头的集合。
另外,如果您正确设置了关系,则无需显式创建PizzaTopping记录,这是一个连接表,我认为我更喜欢使用关系来处理所有事情,首先,可以通过
pizza\u toppings
表设置间接多对多关系

class Pizza < ActiveRecord::Base
  has_many :pizza_toppings
  has_many :toppings, through: :pizza_toppings
end

class Topping < ActiveRecord::Base
  has_many :pizza_toppings
  has_many :pizzas, through: :pizza_toppings
end

class PizzaTopping < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :topping
end
当你给一个模型一个
有很多关联的时候,它会得到一个
\u id
设置器,它接受一个id数组并添加/删除关联,在这种情况下,ActiveRecord也足够聪明,知道当你使用
通过
选项时,它应该通过连接表来设置关联

collection_复选框生成的复选框只提供了一个参数数组,其中包含所选浇头的ID

请注意,您不需要在此处为
使用
fields\u,除非您打算让用户在同一页面上创建比萨和配料。还要确保将
topping_id
param列入白名单

def pizza_params
  params.require(:pizza).permit(:name, topping_ids: [])
end

现在你让我都饿了。

那么你想以相同的形式制作比萨饼和配料吗?我有一个单独的配料模型,你可以添加配料和移除配料。为此,我只希望能够创建一个比萨饼,创建一个表格,以复选框形式列出来自浇头模型的所有浇头。那么你就可以把比萨饼和上面的配料一起存放起来了谢谢你,先生!这是一项工作的编码挑战,我试图在他们给我的存储库中遵循他们的模型(没有“贯穿”关系)。我试图通过挑战绕过它,但除了建立“通过”的关系,没有其他办法。挑战是开放式的,因此我们将看到他们对挑战的接受程度。=)IMHO-使用联接表并通过:
设置与
的关系是在ActiveRecord中建立M2M关系的正确方法。他们很有可能故意做错事。
    <%= f.submit %>
  <% end %>  
</div>
class Pizza < ActiveRecord::Base
  has_many :pizza_toppings
  has_many :toppings, through: :pizza_toppings
end

class Topping < ActiveRecord::Base
  has_many :pizza_toppings
  has_many :pizzas, through: :pizza_toppings
end

class PizzaTopping < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :topping
end
@pizza = Pizza.find_by(name: 'Vesuvio') 
@pizza.toppings 
# => Topping( name: cheese ) ...
@pizza.toppings << Topping.find_by(name: 'Ham')
# inserts a record into the pizza_toppings table
# you can also do the inverse
@topping = Topping.find_by(name: 'Anchovies') 
@topping.pizzas
# => Pizza( name: 'Napoli' )
<% form_for(@pizza) do |f| %>
  <% f.collection_check_boxes(:topping_ids, Topping.all, :id, :name) %>
<% end %>
def pizza_params
  params.require(:pizza).permit(:name, topping_ids: [])
end