好吧,我有个问题我试着在数据库中添加一些配料ID,但我不知道怎么做。
在我的控制器中,我有方法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

然后我犯了个错误:没有身份证就找不到配料。
但是当我把@increation=increation.find(params[:id])改为@increation=increation.all时一切正常。但我不想把我所有的原料都加进去喝,只是一些而已。
有人能帮我一步一步解释一下吗?我会很感激的。

最佳答案

为了节省配料和饮料,您需要将accepts_nested_attributes_for添加到Drink模型中:

# app/models/drink.rb

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

然后在控制器的ingredients_attributes方法中添加drink_params作为允许的参数属性成分字段的设置取决于您的意识例如,如果您希望有一个UI,用户可以在其中键入一个成分名称,并且只有在数据库中还没有该成分时才创建该成分的新记录,那么您需要查找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

10-04 16:34