好吧,我有个问题我试着在数据库中添加一些配料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