嵌套多个模型与茧
问题描述:
我想创建嵌套的形式,将结合两个相关模型的属性。嵌套多个模型与茧
比方说,我有3个模型:配方(主模型),食谱配方(加入配方和配料模型)和配料。
代码如下:
class Recipe < ApplicationRecord
has_many :directions, inverse_of: :recipe
has_many :recipe_ingredients, inverse_of: :recipe
has_many :ingredients, through: :recipe_ingredients
accepts_nested_attributes_for :ingredients,
reject_if: proc { |attributes| attributes['name'].blank? },
allow_destroy: true
accepts_nested_attributes_for :directions,
reject_if: proc { |attributes| attributes['step'].blank? },
allow_destroy: true
accepts_nested_attributes_for :recipe_ingredients,
reject_if: proc { |attributes| attributes['quantity'].blank? },
allow_destroy: true
validates :tittle, :description, :image, presence: true
has_attached_file :image, styles: { :medium => "400x400#" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end
class Ingredient < ApplicationRecord
has_many :recipe_ingredient, inverse_of: :ingredient
has_many :recipes, through: :recipe_ingredient
end
class RecipeIngredient < ApplicationRecord
belongs_to :recipe
belongs_to :ingredient, inverse_of: :recipe_ingredient
end
我的嵌套:
.col-md-6
%h3 Skladniki
#ingredients
= f.simple_fields_for :recipe_ingredients do |recipe_ingredient|
=render 'recipe_ingredient_fields', f: recipe_ingredient
.links
= link_to_add_association 'Dodaj skladnik', f, :recipe_ingredients, class: "btn btn-default add-button", :wrap_object => Proc.new {|recipe_ingredient| recipe_ingredient.build_ingredient; recipe_ingredient }
在这里你可以看到看到,我试图访问两个属性: 1.数量(类RecipeIngredient的) - 这部分是好的 2.名称(类成分) - 这部分是完整的KO
.form-inline.clearfix
.nested-fields
= f.input :quantity, :label => "Ilość", input_html: { class: "form-input form-control" }
= f.fields_for :ingredients_attributes do |ingr|
= ingr.input :name, :label => "Nazwa", input_html: { class: "form-input form-control" }
= link_to_remove_association "Usun", f, class: "form-button btn btn-default"
在验证过程中我得到这个错误
食谱原料成分必须存在
这里是为什么:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"nw14a3HkgSrjE+QpIK4POEzTOqBhtE/EMe+CarWkmI6CSRf0GAdWZGzJQRD4aPurNDNm96TJbt60mc1hl+1JPA==", "recipe"=>{"tittle"=>"Tosty", "description"=>"Testowy przepis", "preparation_time"=>"10.0", "portion"=>"2", "recipe_ingredients_attributes"=>{"1507996685991"=>{"quantity"=>"432", "ingredients_attributes"=>{"name"=>"fasdd"}, "_destroy"=>"false"}, "1507996689888"=>{"quantity"=>"2134432342", "ingredients_attributes"=>{"name"=>"dsad"}, "_destroy"=>"false"}}, "directions_attributes"=>{"0"=>{"step"=>"Krok1", "_destroy"=>"false", "id"=>"1"}, "1"=>{"step"=>"Krok2", "_destroy"=>"false", "id"=>"2"}}}, "commit"=>"Update Recipe", "id"=>"5"}
Recipe Load (0.3ms) SELECT "recipes".* FROM "recipes" WHERE "recipes"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]]
Unpermitted parameter: ingredients_attributes
Unpermitted parameter: ingredients_attributes
(0.2ms) begin transaction
Direction Load (0.3ms) SELECT "directions".* FROM "directions" WHERE "directions"."recipe_id" = ? AND "directions"."id" IN (1, 2) [["recipe_id", 5]]
(0.2ms) rollback transaction
参数传递给方法,只是不recipe_params的比赛定义(私有方法recipe_controller):
def recipe_params
params.require(:recipe).permit(:tittle, :description, :image, :portion, :preparation_time, ingredients_attributes: [:id, :name, :_destroy], directions_attributes: [:id, :step, :_destroy], recipe_ingredients_attributes: [:id, :quantity, :_destroy])
end
重点是...如何解决它?所以recipe_attributes将被传递出recipe_ingredients_attributes?
答
日志文件中的错误指出ingredients_attributes
参数不被允许。如果您检查传递的参数,您可以看到recipe_ingredients_attributes
包含ingredients_attributes
,这是强参数定义(recipe_params
方法)不允许的:它必须支持正确的嵌套。
我知道问题出在哪里。关键是我不知道如何解决这个问题。 之前我使用了包含在Ingredient模型中的数量属性的嵌套表单。但是对于功能,我不得不添加连接模型,现在我不知道如何为成分生成适当的assiociated控件:name and RecipeIngredient:quantity – MajQel