【问题标题】:How to make nested form for model with has_many :through association in Rails 5如何使用 has_many 为模型制作嵌套表单:通过 Rails 5 中的关联
【发布时间】:2018-03-01 18:00:17
【问题描述】:

所以我有两个模型。一是膳食,二是称为食物。一顿饭可以有多个食物,一个食物可以是多餐。基本上是多对多的关联。我通过关联通过 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

【问题讨论】:

  • 我忘了提到,在创建餐点时,我希望能够为餐点分配一个名为“meal_type”的属性,然后继续添加食物。
  • 您的要求远远超出了堆栈溢出的限制。如果您查看我上面链接的要点,这是一个非常完整的示例,说明了如何创建父/子(ren)表单。您需要仔细检查并确定该工作代码如何应用于您的特定示例。

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


【解决方案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 设置器,它接受一个 id 数组并根据需要替换(或创建)关联。

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

【讨论】:

  • 我明白了。但实际上我忘了提到,在创建餐点时,我想为餐点分配一个名为“meal_type”的属性,然后能够添加食物。
猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 2014-03-25
  • 2015-12-19
  • 2016-05-26
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多