好的,所以我有问题。我尝试向数据库中添加一些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时,一切正常。但是我不想添加我所有的食材,只能喝其中的一些。
有人可以帮助我,并逐步解释吗?我将不胜感激。
答案 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