2017-10-02 12 views
0

carrierwaveを使用して画像の寸法を取得しようとしていますが、自分自身のコードで寸法を取得しようとしています。after_saveまたはafter commit、私はこのエラーを取得する:fastwaveを使用して搬送波でアップロードされた画像の実際の寸法を取得

wrong number of arguments (1 for 0) 
    Extracted source (around line #45): 
    # [String] contents of the file 
    # 
    def read 
    file.read if file.respond_to?(:read) 
    end 

carrierwave (0.11.2) lib/carrierwave/uploader/proxy.rb:45:in `read' 
fastimage (2.1.0) lib/fastimage.rb:343:in `block in fetch_using_read' 

モデルでは、これが私のシステム上の単なるローカルファイルであり、この

class Micropost < ApplicationRecord 

    after_save :change_picture_dimensions 
    mount_uploader :picture, PictureUploader 

def change_picture_dimensions 
    if :picture? 
    widthheight = FastImage.size(picture) 
    if widthheight[0] >= 501 
     newheightratio = widthheight[1].to_f/widthheight[0].to_f 
    newheight = newheightratio * 500 
     self.picture = "<img src=\"" + picture.to_s + "\" width=\"500\" height=\"" + newheight.to_s + "\">" 
     else 
     self.picture = "<img src=\"" + picture.to_s + "\" width=\"" + widthheight[0].to_s + "\" height=\"" + widthheight[1].to_s + "\">" 
     end 
    end 
    end 

ようになります。私はminimagick hereを使用して寸法を得ることができますが、carrierwaveのプロセスについて詳しく知りたいのですが、私の方法を使ってこのエラーの原因を調べることができないのはなぜですか?私の方法では、アスペクト比を維持するために比を使用していますが、どの画像に対してもdivの固定幅に収まるだけです。

EDIT:私はオブジェクトが保存される前にそれを行う必要があることを認識しましたが、before_createであっても同じエラーが発生します。

+1

この場合、変数 'picture'は何ですか? –

+0

画像は.jpg自分のフィールドからローカルファイルシステムを受信して​​います。私が抱えている問題は、Fastimageが別のサーバーからURLの次元を取得することができ、ローカルに保存されたファイルからそれらを取り出すことができると確信していますが、それにアクセスする方法を知っている。 –

答えて

1

画像に文字列を割り当てることはできません。 URL、ファイル、またはIOオブジェクトである必要があります。

あなただけの次のことを宣言し500pxなどを合わせて前処理イメージの幅にしたい場合:

# app/uploaders/picture_uploader.rb 
class PictureUploader < CarrierWave::Uploader::Base 
    ... 
    process resize_to_fit: [500, nil] 
end 

class Micropost < ApplicationRecord 
    mount_uploader :picture, PictureUploader 
end 

あなたが行うことができます別のサーバから画像を保存するには:

micropost = Micropost.create(
    picture: 'http://server.example.org/image.png' 
) 

、今あなたがレンダリングすることができますそれはページ上にあります

= image_tag micropost.picture.url 

あなたのモデルに画像サイズを保存することもできます。これを行うにはthis documentationを読んでください。あなたが絵のモデルにあなたのイメージの大きさを保存した後、あなたがimage_tagでそれらを指定することができますが、ブラウザが画像の大きさを検出しますので、私が思うに冗長になり、自動的に

= image_tag micropost.picture.url, width: picture.width, height: picture.height 
+0

その音が正しい。明確にするために、carrierwaveは文字列(ofcourse)としてファイルの名前を保存し、public uploadsフォルダに保存されているファイルへの参照を指していますか?私はちょうどその部分を知りたかったので、私は何をしているのか理解しています。私はそれが言うが、あなたが傾けるときに何が起こっているかを見るのは少し難しい。私はそれに何かを見つけることができませんでした。あなたが言ったように、それは画像を持って来るためのURLを作成します... –

+0

私はStringIOを読んでおり、ファイルから読み取ることができるようにFileオブジェクトにソースをラップするように見えます。 :D –

関連する問題