ペーパークリップを使ってちょっと変わったトリックをしようとして大変苦労しています。これが私の状況です。私のアプリ ユーザーにはアバター画像があり、私の考えは、Jcrop を使用してアバターをトリミングできるようにすることです。私のアプリは Heroku でホストされているため、画像を Amazon S3 にアップロードする必要があります。この人気のあるRailscastを使用してクロッピング機能を実装しましたが、2 倍の画像を処理する必要があります。ここから問題が始まりました。
可能な解決策は、最初に(ユーザーが画像を選択したとき)画像を処理するのではなく、2番目に処理することだと思います。このコードをコントローラーに実装しました。
def change_avatar
@user = current_user
paperclip_parameters = params[:user][:avatar] #first time call
if @temp_image_object.present? || params[:avatar].present?
if check_crop_params #second controller call
@user.avatar = File.new(@user.tmp_avatar_path) #overrides the
redirect_to @user, notice: t("messages.update.user.avatar") if @user.save
else #first controller call
@temp_path = @user.generate_temp_image(paperclip_parameters)
@user.tmp_avatar_path = @new_path #store the custom path to retrieve it in the second call
render :action => 'avatar_crop' if @user.save
end
end
end
def check_crop_params
!params[:user][:crop_x].blank? && !params[:user][:crop_y].blank? && !params[:user][:crop_w].blank? && !params[:user][:crop_h ].blank?
end
そして私のユーザーモデルでは:
#this method copies the original image tempfile when user upload the image to a custom path and returns the custom path
def generate_temp_image(paperclip_parameters)
uploaded_img_path = uploaded_img.tempfile.path
temp_dir = Rails.root.join('public/tmp')
Dir.mkdir(temp_dir) unless Dir.exists?(temp_dir)
FileUtils.cp(uploaded_img.tempfile, temp_dir)
new_path = uploaded_img_path
end
また、画像を処理するときにクロップ変数を取得する jcrop 用のカスタム プロセッサもあります。画像をアップロードすると (最初のコントローラー呼び出し)、change_avatar メソッドはうまく機能しますが、画像をトリミングすると (2 回目のコントローラー呼び出し)、画像はトリミングされず、ペーパークリップは画像スタイル ファイルを作成しますが、トリミングを無視します。
何か案は?私は何をすべきですか?