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

Bri*_*ect 1 ruby ruby-on-rails cocoon-gem

在mackenziechild-recipe_box的第3周,我遇到了一些关于Cocoon的问题.我已经设计安装,以及和我ingredientsdirections属性,当我创建一个新的未保存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
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ 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
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

dpe*_*eze 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
Run Code Online (Sandbox Code Playgroud)

当你包含它时inverse_of,Rails现在知道这些关联并将它们"匹配"在内存中.

更多关于inverse_of:

  • 这项工作,谢谢.我需要深入了解inverse_of (2认同)