创建新配方时,cocoon gem属性不会保存
在mackenziechild-recipe_box的第3周,我遇到了一些关于Cocoon的问题。 我已经安装了设备,当我创建一个新Recipe
时,我的ingredients
和directions
属性没有被保存。 但是当我更新现有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
更多信息: