0

Paperclip が廃止されたため、Paperclip から Shrine に切り替えています。

私のモデルProfilepic.rbファイルでは、次のように画像バリアントの寸法を取得していました:

before_create  :save_ratio    

def save_ratio
    geo = Paperclip::Geometry.from_file(image.queued_for_write[:original])
    self.ratio = geo.width / geo.height
  end

基本的に画像の縦の比率を保存しています。

Paperclip でうまく機能していました。値を保存する前に、一時的な画像を取得queued_for_writeして寸法を確認しました。Paperclip::Geometry

Shrine では、アップローダに以下を追加しました。

plugin :add_metadata
plugin :store_dimensions

すべての情報が利用可能で、画像が S3 に適切にアップロードされるため、うまく機能します。

しかし、画像比率を保存するための私の新しい方法はもはや機能しません:

after_create  :save_ratio
def save_ratio
    self.ratio = self.image[:original].width.to_i / self.image[:original].height.to_i
  end

私は得る

ProfilepicUploader::UploadedFile:0x00007f69a685c750 のエラー未定義メソッド `[]'>

一方、コンソールでは、イメージが作成された後:

Profilepic.first.image[:original].width.to_i

正しい値を返します。

編集

私のアップローダ:

require "image_processing/mini_magick"

class ProfilepicUploader < Shrine
    include ImageProcessing::MiniMagick
    plugin :processing
    plugin :validation_helpers # to validate image data
    plugin :versions
    plugin :add_metadata
    plugin :store_dimensions

    Attacher.validate do
        validate_max_size 5.megabyte
        validate_mime_type_inclusion ['image/jpg', 'image/jpeg', 'image/png']
    end

    process(:store) do |io, context|
        versions = { original: io } # retain original

        io.download do |original|
            pipeline = ImageProcessing::MiniMagick.source(original)

            versions[:editable]  = pipeline.resize_to_fit!(700, 700)
            versions[:thumbnail] = pipeline.resize_to_fill!(400, 400)
            versions[:small]  = pipeline.resize_to_fill!(200, 200)
        end

        versions # return the hash of processed files
    end

end

私のモデル:

class Profilepic < ApplicationRecord
  require "image_processing/mini_magick"
  belongs_to :professionnel
  before_create :set_hashid

  include ProfilepicUploader::Attachment.new(:image) # adds an `image` virtual attribute
  include ProfilepicFinalUploader::Attachment.new(:final_image) # adds an `image` virtual attribute


 attr_accessor :crop_x, :crop_y, :crop_w, :crop_h   

 after_create  :save_ratio_image   

private

  def save_ratio
    self.ratio = self.image[:original].width.to_i / self.image[:original].height.to_i
  end

end
4

2 に答える 2

2

Shrine は、最初にキャッシュされたファイルでレコードを保存し、次に保存された処理済みファイルで再度保存します。エラーが発生する理由は、キャッシュされたファイルが割り当てられているときにコードが最初に実行され、その時点ではまだ処理が行われておらずself.image、単一のアップロードされたファイル (アップロードされたファイルのハッシュではない) であるためです。

おそらく必要なのは、キャッシュされたファイルからすでに比率を抽出することです(これは、処理後のファイルと同じアップロードされたファイルです:original):

def save_ratio
  if image_data_changed? && image_attacher.cached?
    self.ratio = image.width.to_f / image.height.to_f
  end
end

または、列を作成image_widthし、 Shrine に&メタデータimage_heightを自動的に入力させ、後で SQL で比率を計算することもできます。widthheight

class ProfilepicUploader < Shrine
  plugin :metadata_attributes, width: :width, height: height
end

他の回答のコメントで述べたように、添付列に JSONB 列を使用することもできます。これにより、SQL でwidth&heightメタデータをフェッチすることもできます。

于 2019-02-26T08:39:58.723 に答える