在mackenziechild-recipe_box的第3周,我遇到了一些关于Cocoon的问题。我已经安装了设备,当我创建新的ingredients
时,我的directions
和Recipe
属性未被保存。但是当我更新现有的Recipe
时,一切都很好。错误消息是:
必须存在配方食谱,必须存在方向配方
我做错了什么?我正在使用rails 5
应用/模型/ recipe.rb
class Recipe < ApplicationRecord
validates :title, :description, :image, presence: true
has_attached_file :image, styles: { medium: "400x400#" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
belongs_to :user
has_many :ingredients
has_many :directions
accepts_nested_attributes_for :ingredients, :reject_if => :all_blank, :allow_destroy => true
accepts_nested_attributes_for :directions, :reject_if => :all_blank, :allow_destroy => true
end
应用/控制器/ recipes_controller.rb
def new
@recipe = Recipe.new
@recipe = current_user.recipes.build
end
def create
@recipe = Recipe.new(recipe_params)
@recipe = current_user.recipes.build(recipe_params)
if @recipe.save
# show a success flash message and redirect to the recipe show page
flash[:success] = 'New recipe created successfully'
redirect_to @recipe
else
# show fail flash message and render to new page for another shot at creating a recipe
flash[:danger] = 'New recipe failed to save, try again'
render 'new'
end
end
def update
if @recipe.update(recipe_params)
# display a success flash and redirect to recipe show page
flash[:success] = 'Recipe updated successfully'
redirect_to @recipe
else
# display an alert flash and remain on edit page
flash[:danger] = 'Recipe failed to update, try again'
render 'edit'
end
end
private
def recipe_params
params.require(:recipe).permit(:title, :description, :image,
directions_attributes: [:id, :step, :_destroy],
ingredients_attributes: [:id, :name, :_destroy])
end
def recipe_link
@recipe = Recipe.find(params[:id])
end
app / views / recipes / _ingredient_fields.html.haml partial
.form-inline.clearfix
.nested-fields
= f.input :name, input_html: { class: 'form-input form-control' }
= link_to_remove_association 'Remove', f, class: 'form-button btn btn-default'
app / views / recipes / _direction_fields.html.haml partial
.form-inline.clearfix
.nested-fields
= f.input :step, input_html: { class: 'form-input form-control' }
= link_to_remove_association 'Remove', f, class: 'form-button btn btn-default'
答案 0 :(得分:5)
但是当我更新现有的
Recipe
时,一切都很好。
这是你的答案。当您创建新配方时,您没有配方对象,因为它位于服务器内存中。但是当你更新它时,配方对象会被持久化。
这就是您收到Ingredients recipe must exist
和directions recipe must exist
错误的原因。
要解决此问题,您必须在关联中添加inverse_of
。
class Recipe
has_many :ingredients, inverse_of: :recipe
has_many :directions, inverse_of: :recipe
class Ingredient
belongs_to :recipe, inverse_of: :ingredients
class Direction
belongs_to :recipe, inverse_of: :directions
当您包含inverse_of
时,Rails现在知道这些关联,并将在内存中“匹配”它们。
有关inverse_of
的更多信息: