carrierwave缓存图像和activerecord

时间:2012-03-02 18:08:00

标签: ruby-on-rails-3 carrierwave

我正在使用Rails 3和carrierwave gem。

我的问题是下一个:

我正在编写一个包含多个模型和关系的向导表单。所以我的应用程序的产品通过Image模型有许多图像(它已经与载波一起安装)。

因为表单有很多步骤,我想暂时保存CarrierWave中带缓存选项的图像。然后我最后一步我想要恢复图像并加载我的产品。所以我创建了一个名为TempData的模型,它保存临时数据(在本例中为cache_name),一个type_identifier和一个标记can_be_deleted。

例如,这些是我的模型:

产品型号:

class Product < ActiveRecord::Base
  has_many :images, :as => :imageable, :dependent => :destroy
  def save_images_in_temporal_folder(images_attributes)
    begin
      uploader = ImageUploader.new
      images_attributes.to_hash.each do |image|
        uploader.cache!(image[1]['filename'])
        TempData.create(:data => uploader.cache_name, :can_deleted => false, :type_name => TempDataType.product_image_upload_to_words)
      end
    rescue

    end
  end

  def load_images_from_temporal_folder
    begin
      uploader = ImageUploader.new
      tmp_images = []
      TempData.find_all_by_can_deleted_and_type_name(false, TempDataType.product_image_upload_to_words).map(&:data).each do |cache_name|
        tmp_images << uploader.retrieve_from_cache!(cache_name)
      end
      tmp_images
    rescue

    end
  end
end

图片模型

class Image < ActiveRecord::Base
    attr_accessible :imageable_type, :imageable_id, :filename

    belongs_to :imageable, :polymorphic => true
    mount_uploader :filename, ImageUploader

    #validates :filename, :presence => true
end

我的ImageUploader:

class ImageUploader < CarrierWave::Uploader::Base
  configure do |config|
    config.remove_previously_stored_files_after_update = false
  end

  include CarrierWave::RMagick

  storage :file

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

  def self.store_dir_for_file(model, mounted, filename, version = "")
    filename = "#{version}_#{filename}" unless version.blank?
    "uploads/#{model.class.to_s.underscore}/#{mounted}/#{model.id}/#{filename}"
  end

  process :resize_to_limit => [200, 300]

  version :thumb do
    process :resize_to_limit => [50, 50]
  end

  version :big do
    process :resize_to_limit => [400, 400]
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

end

那我如何使用模型和挂载信息保存/缓存图像?如何检索缓存并使用缓存中的图像加载我的产品?

提前致谢。对不起我的英文,如果您需要更多信息,请评论这篇文章。

1 个答案:

答案 0 :(得分:1)

查看下一个链接:

CarrierWave with ActiveResource

我还创建了一个存储时态数据的模型。这里我保存了carrierwave的cache_name。当我保存产品标记时,这些寄存器为can_be_deleted。然后我编写了一个删除这些寄存器并清理Carrierwave缓存文件的任务。