创建新配方时,cocoon gem属性不会保存

时间:2016-06-13 17:53:41

标签: ruby-on-rails ruby cocoon-gem

在mackenziechild-recipe_box的第3周,我遇到了一些关于Cocoon的问题。我已经安装了设备,当我创建新的ingredients时,我的directionsRecipe属性未被保存。但是当我更新现有的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'

1 个答案:

答案 0 :(得分: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的更多信息: