【问题标题】:How do I skip a carrierwave store callback when processing versions处理版本时如何跳过载波存储回调
【发布时间】:2014-06-24 04:48:48
【问题描述】:

我在video uploader 载波类中定义了一个回调
after :store, :my_method
我有三个版本的文件。 original,standard,low

my_method在处理每个版本时执行,即3次,我只需要回调执行一次。

【问题讨论】:

  • 您找到解决方案了吗?我有类似的问题

标签: ruby-on-rails file-upload callback version carrierwave


【解决方案1】:

我知道这是一个很晚的回复,但我最近遇到了同样的问题,所以我决定发布我是如何解决这个“问题”的,因为它似乎没有记录在 carrierwave 的 github 页面上(或者我没有无论如何都能找到它)。

好的,关于 after :store, :my_method 回调,如果你将它放在上传器类的“主体”中,那么每次存储文件时都会执行它,所以在你的情况下,我认为它甚至不会执行仅适用于您的 3 个版本,但也适用于您的原始文件。

假设以下代码定义了您的载波上传器:

class PhotoUploader < CarrierWave::Uploader::Base
  after :store, :my_method

  version :original do
    process :resize_to_limit => [1280,960]
  end

  version :standard, from_version: :original do
    process :resize_to_limit => [640,480]
  end

  version :low, from_version: :standard do
    process :resize_to_limit => [320,240]
  end

  protected
    def my_method
      puts self.version_name
    end
end

这样,after :store 将为存储的每个文件执行,但如果您只想执行它,比如说,对于:low 版本,您所要做的就是移动该行在您的版本定义中。像这样:

class PhotoUploader < CarrierWave::Uploader::Base

  version :original do
    process :resize_to_limit => [1280,960]
  end

  version :standard, from_version: :original do
    process :resize_to_limit => [640,480]
  end

  version :low, from_version: :standard do
    process :resize_to_limit => [320,240]
    after :store, :my_method
  end

  protected
    def my_method
      puts self.version_name
    end
end

我在我的代码上对其进行了测试,它可以工作......我知道你发布这个问题已经很长时间了,可能你得到了与我相同的解决方案。所以我决定回答这个问题,以供以后遇到同样问题的人参考。

【讨论】:

    【解决方案2】:

    我需要同样的东西,我发现original 版本(is callednilcarrierwave 中)总是最后处理。我在源文件中找不到原因,当looking at the code 时感觉很反直觉,但简单的putsversion_name 显示它是这样的。

    你可以用这个事实来解决你的问题:

    after :store, :my_method
    
    def my_method(_file = nil)
      return if version_name
    
      # do something only once, after all versions are stored
    end
    
    

    我使用了carrierwave_backgrounder gem 和它的process_in_background 功能以及gem's optional &lt;uploader_name&gt;_processing column,这让我可以像这样在模型上使用after_update 回调:

    # some_model.rb
    class SomeModel < ActiveRecord::Base
      mount_uploader :image, ImageUploader
      
      after_update do
        if image_processing_changed? && image_processing == false
          # do your stuff e.g. check if the image was actually uploaded to cloud.
          # S3 client from `fog-aws` gem has a handy head_object method to do that.
        end
      end
    end
    

    我一开始以为我不能依赖这个回调,因为我只有process_in_background,也没有存储,但后来我发现即使处理发生在后台和isn't supposed to store in background,它确实包括存储作为recreate_versions方法的一部分,并且由于整个过程已经在后台发生,因此存储也在后台发生(尽管是同步的),并且依赖此回调是安全的。

    以下是相关方法调用链: process_in_backgroundProcessAssetrecreate_versions!setting image_processing flag to false

    carrierwave 1.3.1carrierwave_backgrounder 0.4.2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      相关资源
      最近更新 更多