2011-06-22 14 views
3

これは、this questionへの答えを追求する際の別の質問です。carrierwaveのバージョン処理でモデル属性/アクティブレコードメソッドを使用するにはどうすればよいですか?

ウォーターマークプロセッサでは、ウォーターマークイメージのパスを静的ウォーターマークイメージに設定すると、すべて正常に機能します。

私には、ウォーターマーク、ギャラリー、写真という3つのモデルがあります。透かしhas_many :galleries。ギャラリーbelongs_to :watermarkおよびhas_many :photos。写真belongs_to :galleryおよびmount_uploader :image, PhotoUploader。ここで

は私がphoto_uploader.rbでやってみたいものだ:

version :large do 
    process :watermark 
    process :resize_to_limit => [600, 600] 
    end 

    def watermark 
    manipulate! do |img| 
     watermark = Magick::Image.read(model.gallery.watermark.image_url).first 
     img = img.composite(watermark, Magick::CenterGravity, Magick::OverCompositeOp) 
    end 
    end 

モデルのメソッド/属性を使用するとstore_dir方法で正常に動作しますが、それは透かしのプロセッサでは動作しません。 model.gallery.watermark.image_url引数をウォーターマークプロセッサに渡すにはどうすればよいですか?

答えて

1

モデルにイメージがマウントされるまでに、アップローダークラス内のwatemark def内の変数は無効になりません。それは何をした。私はmongoDBを扱うためにmongoidを使用しています。 Model内にparamを設定します。これは、たとえば私が望む値を保持します。値the_current_model.gallery.watermark.image_url。このパラメータはuser_imageになります。データがデータベースとあなたアップローダクラスに使用が許可さのparam user_image上に保存された後、(あなたがmark_itデフを呼び出しモデルに見るように)

class Asset 
    include Mongoid::Document 
    mount_uploader :image, AssetUploader 

    field :user_image 

    attr_accessible :user_image 

    after_save :mark_it 

    private 
    def mark_it 
    image.recreate_versions! if user_image.present? 
    end 

end 

この問題を解決するための鍵は、イメージを再作成です。

class AssetUploader < CarrierWave::Uploader::Base 

    include CarrierWave::RMagick 

    storage :file 
    # storage :fog 

    after :cache, :unlink_original_cache 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 
    # end 

    process :resize_to_fit => [800, 800] 
    process :quality => 80 

    version :thumb do 
    process :resize_to_fit => [200, 200] 
    end 

    version :large do 
    process :watermark 
    end 

    def watermark 
    if model.user_name.present? 
     manipulate! do |img| 
     text = Magick::Draw.new 
     text.gravity = Magick::CenterGravity 
     text.fill = 'white'  
     text.pointsize = 40 
     text.stroke = 'none' 
     text.annotate(img, 0, 0, 0, 0, "#{model.user_name}") 
     img 
     end 
    end 
    end 

    def unlink_original(file) 
    File.delete path if version_name.blank? 
    end 

    def unlink_original_cache(file) 
    File.delete if version_name.blank? 
    end 

    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

end 

今の鍵はここにある:

def watermark 
     if model.user_name.present? 
      manipulate! do |img| 
      text = Magick::Draw.new 
      text.gravity = Magick::CenterGravity 
      text.fill = 'white'  
      text.pointsize = 40 
      text.stroke = 'none' 
      text.annotate(img, 0, 0, 0, 0, "#{model.user_name}") 
      img 
      end 
     end 
     end 

モデル上のuser_nameのparamが(デシベル上で作成)設定されている場合、メソッドの透かしのみ、その上にウォーターマーク画像を作成します。したがって、データがdbに保存されるとき、このパラメータはアップロード者クラスが必要に応じて使用できるようになります。

私がやったこと、それはとてもうまくいった! 私はそれが助けてくれることを願っています!

関連する問題