2

現在、Paperclip を使用して画像をアップロードし、サムネイルを自動的に生成しています。ここで、アップロードされた画像の左端のピクセル列を使用して 1 ピクセル幅の画像を生成する 2 番目のスタイルも追加したいと思います (高さも元の画像と同じにする必要があります)。CSS を介して、1 ピクセル幅の画像を繰り返し背景として使用します。

Paperclip のデフォルトの Thumbnail プロセッサを使用してその背景画像を生成することは可能ですか?それとも独自のカスタム プロセッサを作成する必要がありますか? をサブクラス化するカスタム プロセッサを作成しようとしましたが、メソッドの適切なPaperclip::Processor使用方法がわかりませんでした。ここで Ryan Bate の Railcast に基づいPaperclip.runてサブクラス化しようとしています: http://railscasts.com/episodes/182-cropping-images、しかしそれはこのエラーをスローしています:Paperclip::Thumbnail

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]):
app/controllers/images_controller.rb:11:in `create'

images_controller.rb の 11 行目:

@image = @review.images.build(params[:image])

Autobackground カスタム プロセッサを使用しない場合、images_controller.rb の 11 行目は正常に動作するため、エラーはプロセッサ内のコードに違いありません。

これまでの私のコードは次のとおりです。

#/app/models/image.rb
class Image < ActiveRecord::Base
   belongs_to :review

   has_attached_file :image, :styles => {
      :thumb => "32x32#",
      :auto_bg => { :processors => [:autobackground] }
   }
end

#/lib/paperclip_processors/Autobackground.rb
module Paperclip
   class Autobackground < Thumbnail
      def transformation_command
         if crop_command
            crop_command + super.sub(/ -crop \S+/, '')
         else
            super
         end
      end

      def crop_command
         target = @attachment.instance
         if target.cropping?
            " -crop '1x#{target.height}+0+0'"
         end
      end
   end
end
4

2 に答える 2

2

誰かが興味を持っているなら、私はこれを機能させることができました。これを修正するのに最も役立ったのは、Rails デバッグ コンソール (ようやく適切に使い始めたもの) でした。このコンソールを使用すると、自分のクラスが継承しているPaperclip::Thumbnailクラスの変数をより詳しく調べることができました。Autobackground

私が行ったことは次のとおり:auto_bgです。プロセッサで識別できる特別な文字列を指すようにスタイルを変更しました。私のプロセッサは からサブクラス化されPaperclip::Thumbnailているため、スタイルが指す文字列は に保存され@options[:geometry]ます。オーバーライドされたtransformation_commandメソッドで行う必要があるの@options[:geometry]は、が特別なauto_bg文字列に設定されているかどうかを確認し、クラスに通常のことをさcreate_auto_bgせる代わりにメソッドを実行することだけです。Thumbnail私の古いメソッドは、ImageMagick コマンドを作成するために必要なcreate_auto_bg文字列の配列を適切に作成していませんでした。そのため、Ryan Bate の railscast (彼のコードでどのように機能するかはわかりません)。Thumbnail@current_geometrytarget = @attachment.instance

これにはもっと洗練された解決策があると確信していますが、私はまだ Ruby と RoR に慣れていないので、今のところこれを行う必要があります。これが同様の課題に直面している人の助けになることを願っています:)

#/app/models/image.rb
class Image < ActiveRecord::Base
   belongs_to :review
   has_attached_file :image, :styles => { :thumb => "32x32#", :auto_bg => "auto_bg" }, :processors => [:autobackground]
end

#/lib/paperclip_processors/Autobackground.rb
module Paperclip
   class Autobackground < Thumbnail
      def transformation_command
         if @options[:geometry] == "auto_bg"
            create_auto_bg
         else
            super
         end
      end

      def create_auto_bg
         #debugger
         height = @current_geometry.height.to_i.to_s
         trans = []
         trans << "-crop" << "1x#{height}+0+0"
         trans
      end
   end
end
于 2010-10-14T18:34:33.940 に答える
1

ヘルパーメソッドを作成し、フィルターで呼び出すことをお勧めします...

あなたのためにこの魔法を行うことができるいくつかのツールが利用可能です...

コーディング スタイルに関するもう 1 つのコメント...

次のようなRubyスタイルのコードを書きたいと思います

def crop_command
    target = @attachment.instance
    if target.cropping?
        " -crop '1x#{target.height}+0+0'"
    end
end

def crop_command
    target = @attachment.instance
    " -crop '1x#{target.height}+0+0'" if target.cropping?
end

可能な限り、ルビー固有のスタイルを使用してください...

于 2010-10-14T07:21:28.650 に答える