Bri*_*ect 1 ruby ruby-on-rails cocoon-gem
在mackenziechild-recipe_box的第3周,我遇到了一些关于Cocoon的问题.我已经设计安装,以及和我ingredients和directions属性,当我创建一个新的未保存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)
但是当我更新现有产品时
Recipe,一切都很好.
那是你的答案.当您创建新配方时,您没有配方对象,因为它位于服务器内存中.但是当你更新它时,配方对象是持久的.
这就是为什么你得到的Ingredients 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
Run Code Online (Sandbox Code Playgroud)
当你包含它时inverse_of,Rails现在知道这些关联并将它们"匹配"在内存中.
更多关于inverse_of:
| 归档时间: |
|
| 查看次数: |
896 次 |
| 最近记录: |