2017-12-29 32 views
0

私は、自分のコンピュータからアップロードしたいプロフィール画像(carrierwave)を選ぶことができます。 Whatsapp(私はcarrierwave-crop-on-flyを使用)のように、1:1の正方形の縦横比が好きで、最後に切り取った画像はCloudinaryでクラウドにアップロードされ、モデル「user」の「image」列にバインドされます。 。私はcloudinary's tutorialに従って統合を行いましたCarrierwave Cloudly integration Ruby on Rails

ここまで私がこれまで行ってきたことは次のとおりです。ここでcloudinaryにバインドさアップローダーです:

ユーザーズモデルで
class AvatarUploader < CarrierWave::Uploader::Base 

    include Cloudinary::CarrierWave 
    include CarrierWave::MiniMagick 
    process crop: [100, 100] 

    def public_id 
    model.nombre 
    end 
end 

私はそのプロフィール写真を変更することができます私の見解では
class User < ActiveRecord::Base 
    mount_uploader :image, AvatarUploader 
    ... 

.well 
    .row-fluid 
    .span8.offset2 
     %p 
     .inline-block 
      = form_for @user, method: :post, url: change_photo_self_url do |f| 
      = f.file_field :image 
      .hidden#cropbox= f.cropbox :image, width: 300, height: 300 
      = f.submit "Crop", class: "btn btn-success blanco" 
      ... 

(ときfile_field #cropboxが表示されます変更、すなわち画像が検査されるとき)

最後に、users_controller

... 
    def change_photo 
     user = current_user 
     user.update_attributes(user_params) 
     sign_in(user) 
     redirect_to profile_url 
    end 
    private 
     def user_params 
     params.require(:user).permit(..., :image) 
    end 

"クロッピング"の問題なしですべて正常に機能しました。つまり、ユーザーは画像をアップロードしてすべてをうまく処理することができると実装しました。しかし、私がクロップするためのコントロールを追加するとクラッシュする。私は、画像を選択すると、トリミング面が表示され、私は完全にそれを選択することができますが、私は送信ボタン「トリミング」をクリックすると、次のエラーであっても、コントローラのアクションに到達する前にトリガーされます。ここでは

Rack::QueryParser::ParameterTypeError at /change_photo 
expected Hash (got Hash) for param `image' 

ですコールののparams:(

#<Rack::QueryParser::Params:0x396f9f0 @limit=65536, @size=5, @params={"image"=>{:filename=>"140.jpg", :type=>"image/jpeg", :name=>"user[image]", :tempfile=>#<Tempfile:C:/Users/josem/AppData/Local/Temp/RackMultipart20171229-7548-15105ol.jpg>, :head=>"Content-Disposition: form-data; name=\"user[image]\"; filename=\"140.jpg\"\r\nContent-Type: image/jpeg\r\n"}}> 

私は、同じ名前を持つ2つのparamsを推測することは問題である可能性がありますが、私はそれを動作させるためにそれを変更する方法がわからないと私はなぜ」期待されるハッシュを理解していませんハッシュを取得しました)」問題です

答えて

0

私は「車rierwave-crop-on-fly "を使用している場合は、それを別の方法で達成することを検討してください。 Cloudinaryは、すぐに利用できるアップロードウィジェット(https://cloudinary.com/documentation/upload_widget)も提供しています。これは、クライアント側のクロッピングを実行する機能もサポートしています。 は、ここでは、テストすることができ、基本的なRoRの/ CarrierWave/Cloudinary's-アップロードウィジェットサンプルプロジェクトです:https://github.com/taragano/Carrierwave_widget

このプロジェクトは現在、トリミング機能を除外し、それが簡単に提供されるドキュメントのページを参照して、追加することができます。 ウィジェットで設定できるパラメータの1つは、cropping_aspect_ratioです。これは役に立ちます。

また、ウィジェットを使用すると、クライアント側でクロップが行われるため、アップロードの迅速化に役立ちます。また、サーバーでクロッピングを処理する必要はありません。