使用联接表创建方法-具有并属于许多

时间:2018-10-11 02:04:43

标签: ruby-on-rails ruby jointable

好的,所以我有问题。我尝试向数据库中添加一些Ingredient_ids,但是我不知道该怎么做。

在我的控制器中,我有方法create

def create
  @drink = Drink.new(drink_params)
  @ingredient = Ingredient.find(params[:id])
  if @drink.save
    @drink.ingredients << @ingredient
    redirect_to drinks_path
  else
    render 'new'
  end
end

然后我有一个错误:没有ID找不到配料。

但是当我将@ingredient = Ingredient.find(params [:id])更改为@ingredient = Ingredient.all时,一切正常。但是我不想添加我所有的食材,只能喝其中的一些。

有人可以帮助我,并逐步解释吗?我将不胜感激。

1 个答案:

答案 0 :(得分:0)

要保存配料和饮料,您需要在Drink模型中添加accepts_nested_attributes_for

# app/models/drink.rb

class Drink < ActiveRecord::Base
  accepts_nested_attributes_for :ingredients
  ...
end

然后在控制器的ingredients_attributes方法中添加drink_params作为允许的param属性。成分的字段集取决于您的认识。例如,如果您想拥有一个用户界面,用户可以在其中仅在数据库中没有此类成分的情况下键入成分名称和要创建的该成分的新记录,那么您需要查看ingrediends表并将id添加到ingredients_attributes

# app/controllers/drinks_controller.rb

class DrinksController < ApplicationController
  def create
    @drink = Drink.new(drink_params)
    if @drink.save
      redirect_to drinks_path
    else
      render 'new'
    end
  end

  private

  def drink_params
    params.require(:drink).permit(:name, ingredients_attributes: [:name]).tap do |p|
      p[:ingredients_attributes].each do |i|
        ingredient = Ingredient.find_by(name: i[:name])
        i[:id] = ingredient.id if ingredient
      end
    end
  end
end