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

在mackenziechild-recipe_box的第3周,我遇到了一些关于Cocoon的问题。 我已经安装了设备,当我创建一个新Recipe时,我的ingredientsdirections属性没有被保存。 但是当我更新现有Recipe ,一切都很好。 错误消息是:

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

我究竟做错了什么? 我正在使用rails 5

应用程序/模型/ recipe.rb

 class Recipe  :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' 

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

那是你的答案。 当您创建新配方时,您没有配方对象,因为它位于服务器内存中。 但是当你更新它时,配方对象是持久的。

这就是为什么你Ingredients recipe must exist directions 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更多信息: