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

6
我将能力传递给Carrierwave上传的图像进行裁剪。这里是我正在关注的Youtube上的RailsCast视频

但在Uploader中包含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个回答

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 关联不存在时,记录是否在验证失败。


1
谢谢,您能否改进您的回答,写明这是因为Rails5默认情况下belongs_to需要设置为true,并且它与我的问题有什么关系。我相信人们会感激的。我已经不在那个项目上工作了,所以不能轻易测试这个。 - Julius Dzidzevičius
作为一个业余爱好者,我同意popStar的观点。你建议我对Rails进行更改,却没有真正解释我在做什么或这个方法在做什么。感觉非常危险。 - Chiperific
你可以将它放在config/application.rb文件中的Application类的Rails::Application end块内 - 代码块: config.active_record.belongs_to_required_by_default = false - Martin T.
我在application.rb中做了这个,而且它起作用了。 - marimaf

0
在您的 *_uploader.rb 文件中,只需编写以下函数:
  def marked_for_destruction?

  end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接