如何使用has_many为模型创建嵌套表单:通过Rails 5中的关联

时间:2018-03-01 18:00:18

标签: ruby-on-rails nested-forms has-many-through polymorphic-associations model-associations

所以我有两个型号。一个是用餐,第二个叫做食物。一顿饭可以有多种食物,食物可以是多餐。基本上是一个多对多的关联。我通过关联使用has_many做到了这一点。关联模型称为MealFood。 我想制作一个表格,这样当我创建一顿饭时,我可以选择通过复选框或选择选项字段选择任意多的食物。 我怎样才能做到这一点?我对Rails很新,所以我甚至都不知道从哪里开始。任何帮助都会很棒!提前谢谢!

到目前为止,这是我的代码:

class Meal < ApplicationRecord
    belongs_to :user
    has_many :meal_foods
    has_many :foods, through: :meal_foods
end

class Food < ApplicationRecord
    has_many :meal_foods
    has_many :meals, through: :meal_foods
end

class MealFood < ApplicationRecord
    belongs_to :meal
    belongs_to :food
end

用餐控制器

def index
end

def new
    @meal = Meal.new
    @meal.foods.new
end

def create
    @meal = Meal.new(meal_params)

    if @meal.save
        redirect_to @meal
    else
        render 'new'
    end
end

private

def meal_params
    params.require(:meal).permit(:meal_type, :date, :total_calories, :total_carbohydrates, :total_fat, foods_attributes: [:name, :calories, :proteins, :carbohydrates, :fat])
end

1 个答案:

答案 0 :(得分:1)

您不需要嵌套属性来分配关联。您真正需要的只是复选框或选择:

<%= form_with model: @meal do |f| %>
  # ...
  <%= f.collection_select(:foods_ids, Food.all, :id, :name) %>
  <%= f.submit %>
<% end %>

然后,您需要将属性foods_ids属性列入白名单:

def food_params
  params.require(:food).permit(:foo, :bar, foods_ids: [])
end

这适用于每个多对多关联都有一个_ids setter,它接受一组id并根据需要替换(或创建)关联。

只有在需要关联记录的传递属性时才需要嵌套属性。