2

私はもうしばらくこれにいます。このRailsCastを使用して、CarrierWaveで動作するように変更することができました-少なくとも理論的には。ユーザーがプロフィール写真を切り抜いて、CarrierWaveを使用してS3にアップロードできるようにしようとしています。これまでに機能するものは次のとおりです。

  • ユーザーは、残りのプロフィール情報とともに画像をアップロードします
  • 写真をトリミングできるトリミングページに正常に移動します。写真がアップロードされ、元の画像のサイズが正常にキャプチャされます。
  • 「切り抜き」をクリックして画像を保存しても、エラーは発生しません(モデルは問題なく保存されます)が、私が知る限り、実際にはバージョンを切り抜いたり再作成したりすることもありません。

だから、これが私が持っているコードです。モデルは次のとおりです。

attr_accessor :crop_x, :crop_y, :crop_w, :crop_h, :original_width, :original_height
attr_accessible :avatar, :remove_avatar
after_update :reprocess_avatar, :if => :cropping?

mount_uploader :avatar, ProfileBaseUploader

def cropping?
  !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end

private
  def reprocess_avatar
    avatar.process!
    avatar.recreate_versions!
  end

きれいなボイラープレート-crop_xなどの属性がクロップビューから割り当てられます。これらが渡されて正しく割り当てられ、reprocess_avatarメソッドが呼び出されていることを確認しました。

これが私のアップローダーコードです:

include CarrierWave::MiniMagick
include CarrierWaveDirect::Uploader

storage :fog

require 'guid'

process :cropper
process :store_best_geometry

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

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

version :large do
  process :resize_to_fit => [500, 500]
end

def extension_white_list
    %w(jpg jpeg gif png)
end

def filename
   @name ||= "#{secure_token}.#{file.extension}" if original_filename.present?
end

def store_best_geometry
  manipulate! do |img|
    if model
      model.original_width = img['width']
      model.original_height = img['height']
    end
    img = yield(img) if block_given?
    img
  end
end

def cropper
  return unless model.cropping?
  manipulate! do |img|
    img = img.crop("#{model.crop_x}x#{model.crop_y}+#{model.crop_w}+#{model.crop_h}")
    img
  end
end

protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, Guid.new)
  end

プロセスだと思います!とrecreate_versions!メソッドが正しく機能していないだけですが、その理由はわかりません。提供できるエラーはありません(エラーを生成する方法を誰かが知っている場合は、喜んでそうします)。store_best_geometryメソッドがうまく機能していることを知っています。クロッパーについても同じことは言えません。

何か案は?

4

1 に答える 1

9

悪い飛行機墜落事故のように、私が間違ったことをしたことがたくさんあります。

最初に、私は間違った順序で作物についての議論をしました。私の質問では、あなたは私が持っていたことに気付くでしょう:

img.crop('[x offset]x[y offset]+[width]+[height]')

正しい順序は次のとおりです。

img.crop('[width]x[height]+[x offset]+[y offset]')

それが問題の1つでした。間違った順序でそれを行おうとすると、無効として提供されているジオメトリに関するエラーがスローされていました(コンソールを掘り下げて見つけました)。

次の問題:私のcropperメソッドでyieldチェーンを切断し、IMAGEの代わりにSTRINGを返します。Cropメソッドが文字列を返すことがわかりました。元のクロッパーメソッドを見てください。

def cropper
  return unless model.cropping?
  manipulate! do |img|
    img = img.crop("#{model.crop_x}x#{model.crop_y}+#{model.crop_w}+#{model.crop_h}")
    img
  end
end

おっと!最後に返されるのは文字列です。正しい方法は、画像のメソッドを直接呼び出すことです。

def cropper
  return unless model.cropping?
  manipulate! do |img|
    img.crop("#{model.crop_w}x#{model.crop_h}+#{model.crop_x}+#{model.crop_y}")
    img = yield(img) if block_given?
    img
  end
end

私が間違っていた最後のこと-そしてこれは完全なアマチュア時間の間違いでした-いくつかの重要な属性にアクセスできるようにすることではありませんでした。私の無限の知恵では、attr_accessorが属性にアクセスできるようになると思いました。いいえ。モデルを変更して、crop_x、crop_y、crop_w、およびcrop_h引数にアクセスできるようにする必要がありました。

attr_accessor :crop_x, :crop_y, :crop_w, :crop_h, :original_width, :original_height
attr_accessible :avatar, :remove_avatar, :crop_x, :crop_y, :crop_w, :crop_h
after_update :reprocess_avatar, :if => :cropping?

最後の注意点です。重要ではありませんが、知っておくと便利です。プロセスを呼び出す必要はありませんでした!recreate_versionsとして!私のためにそれをします。

これが少なくとも1人の人に役立つことを願っています。

于 2012-05-29T02:51:35.560 に答える