2016-06-13 43 views
1

在mackenziechild-recipe_box的第3周,我遇到了Cocoon的一些问题。我也有设计,以及当我创建一个新的Recipe时,我的ingredientsdirections属性不会被保存。但是当我更新现有的Recipe时,一切都很好。该错误信息是:茧宝石属性创建新配方时不保存

主料配方必须存在,方向配方必须存在

我在做什么错?我使用的轨道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 

应用程序/视图/配方/ _ingredient_fields。 html.haml部分

.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' 

应用程序/视图/配方/ _direction_fields.html.haml部分

.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

那一行,你得到这个错误?添加'inverse_of'实际上是否解决了任何问题(因为我从来没有这样做过)。在你的'create'中你创建了两次'@ recipe' - 你注意到了吗? – nathanvda

回答

5

但是,当我更新现有Recipe,一切都很好。

这就是你的答案。当您创建新配方时,您没有配方对象,因为它在服务器内存中。但是当你更新它时,配方对象将被保留。

这就是为什么你会得到Ingredients recipe must existdirections 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

+2

这项工作,谢谢。我需要深入反思 – Brioproject