私のアプリはcarrierwaveとomniauth(facebook)を使用していますが、小さな問題が1つあります。
- ユーザーが最初にFacebookアカウントでログインするとき、私は彼のFacebookプロフィール画像を彼のデフォルト画像として作成します。(彼はFBアカウントなどでサインアップする必要はありません。彼がログインすると、それ以上の情報を提供せずに私のアプリケーションにサインアップします)
- ユーザーが最初に私のアプリから「ローカル」でアカウントを作成するとき、彼はプロフィール画像をアップロードすることを選択できます。したがって、
profile_image
ユーザーモデルにはフィールドがありProfileUploader
、キャリアウェーブからこのフィールドにマウントされます。
問題:Facebookの画像のURLをこのフィールドに保存すると、エラーが発生します。これは、このフィールドにアップローダーがマウントされているために発生していると思います。フィールドは文字列タイプですが、carrierwaveを介して画像をアップロードせずにこのフィールドにURLを保存することはできません。
この問題を回避するには、FBイメージのURLを別のフィールドに保存しother_profile_image
ます。ユーザーのアカウントがFBから作成されるたびに、このフィールドから彼のイメージを呼び出します。
例えば、
<% if @user.provider == "local" %>
<% if @user.profile_image.blank? %>
<%= link_to image_tag('default.jpg'), '/users/'+@user.id.to_s %>
<% else %>
<%= link_to image_tag(@user.profile_image_url(:thumb)), '/users/'+@user.id.to_s %>
<% end %>
<% elsif @user.provider == "facebook" %>
<%= link_to image_tag(@user.other_profile_image), '/users/'+@user.id.to_s %>
<% end %>
provider=local specifies accounts created on the application, not from other third-parties like FB
私の回避策はうまくいきますが、この問題を処理するためのより良い解決策が必要であることがわかっているので、それは私を悩ませています。次の簡単なタスクを処理する方法を見つける必要があります。
- ユーザーがローカルでサインアップすると、プロフィール写真をアップロードすることを選択できます。そうでない場合は、デフォルトの画像のURLをプロフィール画像のURLフィールドに保存します。
- ユーザーが自分のFBアカウントを使用する場合、Facebookの画像を最初のプロフィール写真に設定する必要があります。現在、2つの異なるフィールドを使用しています。これは、carrierwaveアップローダーがマウントされているprofile_imageフィールドにURL文字列を格納しようとする
profile_image
とother_profile_image
、carrierwaveがエラーをスローしたためです。
この問題を解決する素晴らしい方法があることを願っています!よろしくお願いします。どうもありがとうございます。