使用 accepts_nested_attributes_for 和 fields_for 创建控制器方法
Create controller method with accepts_nested_attributes_for and fields_for
我正在使用 Rails 5.2.0 构建一个关于食谱的 Web 应用程序,我对控制器的 create
方法有疑问。
这是我的模型:
class Recipe < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :ingredients, through: :quantities
accepts_nested_attributes_for :quantities, allow_destroy: true
end
class Quantity < ApplicationRecord
belongs_to :recipe
belongs_to :ingredient
end
class Ingredient < ApplicationRecord
has_many :quantities
has_many :recipes, through: :quantities
end
这里是创建新食谱的视图:
<%= form_for(@recipe) do |f| %>
<%= f.label :name, "Name" %>
<%= f.text_field :name %>
<%= f.label :servings, "Servings" %>
<%= f.number_field :servings %>
<%= f.fields_for :quantities do |quantity| %>
<%= f.hidden_field :_destroy, class: "hidden-field-to-destroy" %>
<%= f.label :ingredient_id, "Ingredient Name" %>
<%= f.text_field :ingredient_id%>
<%= f.label :amount, "Amount" %>
<%= f.number_field :amount %>
<%= f.label :unit, "Unit" %>
<%= f.select(:unit, ["kg","g","l","ml"], {include_blank: true}) %>
<% end %>
<%= f.submit 'Add new recipe' %>
<% end %>
我可以使用 jquery 动态添加新成分,也可以以相同的形式删除它们。
控制器的update
方法完美运行,但create
方法不起作用:
class RecipesController < ApplicationController
def create
@recipe = current_user.recipes.build(recipe_params)
if @recipe.save
flash[:success] = "New recipe created correctly."
redirect_to @recipe
else
render 'new'
end
end
def update
@recipe = Recipe.find(params[:id])
if @recipe.update_attributes(recipe_params)
flash[:success] = "The recipe has been updated correctly."
redirect_to @recipe
else
render 'edit'
end
end
private
def recipe_params
params.require(:recipe).permit( :name, :servings, quantities_attributes: [:ingredient_id, :amount, :unit,:_destroy, :id, :recipe_id])
end
end
我正在尝试 @recipe = current_user.recipes.build(recipe_params)
但我在视图中收到以下错误:
- 配方数量不能为空
我认为出现这种情况是因为在尝试创建关系时,需要指明recipe_id,但尚未创建食谱,无法指明id。
你能告诉我首先创建配方然后能够通过配方控制器的创建方法中的数量添加成分的正确方法是什么吗?
根据分享的消息,qunatity_recipes 不能为空,您还没有指定任何条件来管理它。
当前
class Recipe < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :ingredients, through: :quantities
accepts_nested_attributes_for :quantities, allow_destroy: true
end
将食谱 class
的接受嵌套属性更新为 allow_nil
class Recipe < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :ingredients, through: :quantities
accepts_nested_attributes_for :quantities, allow_destroy: true, allow_nil: true
end
我正在使用 Rails 5.2.0 构建一个关于食谱的 Web 应用程序,我对控制器的 create
方法有疑问。
这是我的模型:
class Recipe < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :ingredients, through: :quantities
accepts_nested_attributes_for :quantities, allow_destroy: true
end
class Quantity < ApplicationRecord
belongs_to :recipe
belongs_to :ingredient
end
class Ingredient < ApplicationRecord
has_many :quantities
has_many :recipes, through: :quantities
end
这里是创建新食谱的视图:
<%= form_for(@recipe) do |f| %>
<%= f.label :name, "Name" %>
<%= f.text_field :name %>
<%= f.label :servings, "Servings" %>
<%= f.number_field :servings %>
<%= f.fields_for :quantities do |quantity| %>
<%= f.hidden_field :_destroy, class: "hidden-field-to-destroy" %>
<%= f.label :ingredient_id, "Ingredient Name" %>
<%= f.text_field :ingredient_id%>
<%= f.label :amount, "Amount" %>
<%= f.number_field :amount %>
<%= f.label :unit, "Unit" %>
<%= f.select(:unit, ["kg","g","l","ml"], {include_blank: true}) %>
<% end %>
<%= f.submit 'Add new recipe' %>
<% end %>
我可以使用 jquery 动态添加新成分,也可以以相同的形式删除它们。
控制器的update
方法完美运行,但create
方法不起作用:
class RecipesController < ApplicationController
def create
@recipe = current_user.recipes.build(recipe_params)
if @recipe.save
flash[:success] = "New recipe created correctly."
redirect_to @recipe
else
render 'new'
end
end
def update
@recipe = Recipe.find(params[:id])
if @recipe.update_attributes(recipe_params)
flash[:success] = "The recipe has been updated correctly."
redirect_to @recipe
else
render 'edit'
end
end
private
def recipe_params
params.require(:recipe).permit( :name, :servings, quantities_attributes: [:ingredient_id, :amount, :unit,:_destroy, :id, :recipe_id])
end
end
我正在尝试 @recipe = current_user.recipes.build(recipe_params)
但我在视图中收到以下错误:
- 配方数量不能为空
我认为出现这种情况是因为在尝试创建关系时,需要指明recipe_id,但尚未创建食谱,无法指明id。
你能告诉我首先创建配方然后能够通过配方控制器的创建方法中的数量添加成分的正确方法是什么吗?
根据分享的消息,qunatity_recipes 不能为空,您还没有指定任何条件来管理它。
当前
class Recipe < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :ingredients, through: :quantities
accepts_nested_attributes_for :quantities, allow_destroy: true
end
将食谱 class
的接受嵌套属性更新为 allow_nilclass Recipe < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :ingredients, through: :quantities
accepts_nested_attributes_for :quantities, allow_destroy: true, allow_nil: true
end