私はもうしばらくこれにいます。この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メソッドがうまく機能していることを知っています。クロッパーについても同じことは言えません。
何か案は?