未定义的方法`marked_for_destruction?' CarrierWave,RMagick

时间:2016-12-14 11:28:10

标签: carrierwave ruby-on-rails-5 rmagick

我正在传递由Carrierwave上传的裁剪图像的功能。以下是RailsCast video on Youtube,我正在关注。

但是在将RMagick包含在上传器中后,我收到了:

undefined method `marked_for_destruction?' for #<ImageUploader:0x007fe86634fcf0>

我觉得这真是太糟糕了。我没有在任何地方调用这种方法。但如果没有定义,我们来定义它!它奏效了!但后来我检查了更多有关此方法的信息,发现它内置于 Active Record Autosave Association 模块中。从文档中,关于这种方法:

  

返回此记录是否将作为其中一部分销毁   父母保存交易。

     

仅在为此启用父级上的:autosave选项时才有用   相关模型。

但我没有将autosave: true传递给任何对象!

所以,我的第一个问题 - 默认是以某种方式完成的吗?

2 - 在RailsCast教程中,他没有定义这种方法。我为什么要这样做?

3 - 我传递了我的代码。有错误吗?

4 - 如果可能的话,任何人都能解释一下这个过程是如何运作的吗?

非常感谢!

product.rb:

  has_one :image
  validates :image, presence: true
  mount_uploader :image, ImageUploader

products_controller.rb:

  def create
    @product = Product.new(product_params)
    @product.category_id = params[:category_id]
    @product.user_id = current_user.id

    respond_to do |format|
      if @product.save
        if params[:product][:image].present?
          format.html { render :crop }
        else
          format.html { redirect_to @product, notice: 'Product was successfully created.' }
          format.json { render :show, status: :created, location: @product }
        end
      else
        format.html { render :new }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

image_uploader.rb:

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  def marked_for_destruction?
    @marked_for_destruction
  end

  def mark_for_destruction
    @marked_for_destruction = true
  end

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :large do
    resize_to_limit(600,600)
  end
end

2 个答案:

答案 0 :(得分:0)

在* _uploader.rb文件中,只需编写函数:

  def marked_for_destruction?

  end

答案 1 :(得分:-1)

如果你正在使用Rails 5:

打开new_framework_defaults.rb并更改:

Rails.application.config.active_record.belongs_to_required_by_default = true

Rails.application.config.active_record.belongs_to_required_by_default = false
  

config.active_record.belongs_to_required_by_default是一个布尔值   如果belongs_to,则值和控制记录是否未通过验证   协会不存在。