1

ペーパークリップを使ってちょっと変わったトリックをしようとして大変苦労しています。これが私の状況です。私のアプリ ユーザーにはアバター画像があり、私の考えは、Jcrop を使用してアバターをトリミングできるようにすることです。私のアプリは Heroku でホストされているため、画像を A​​mazon 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 回目のコントローラー呼び出し)、画像はトリミングされず、ペーパークリップは画像スタイル ファイルを作成しますが、トリミングを無視します。

何か案は?私は何をすべきですか?

4

2 に答える 2

0

私は小さな詳細を忘れていました..サーバーログを見て、ペーパークリッププロセスが画像をトリミングしていないことに気付きました。 crop_h. 何らかの理由で、このパラメーターがプロセッサーに到達しなかったため、画像がトリミングされることはありませんでした。私がしなければならなかったのは、このパラメーターをユーザー変数に手動で割り当てることだけで、うまくいきました!

于 2013-03-29T14:11:30.857 に答える