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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未定义的方法`marked_for_destruction?' CarrierWave,RMagick相关的知识,希望对你有一定的参考价值。

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

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

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

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

返回此记录是否将作为父保存事务的一部分销毁。

仅在为此关联模型启用父级上的: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
答案

如果您使用的是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关联,则控制记录是否未通过验证。

以上是关于未定义的方法`marked_for_destruction?' CarrierWave,RMagick的主要内容,如果未能解决你的问题,请参考以下文章

jni报错日志打印方法未定义

Laravel 调用未定义的方法。方法存在

对结构方法的未定义引用[重复]

服务中的方法在执行时未定义,但在登录到控制台时未定义

未定义的方法和未初始化的常量错误

方法未定义为类