#はじめに
*(注意:この記事は学習の一環として実装した物の一部を記事にしています。又、技術的に最適な方法ではない可能性があります。)
omniauth-twitter
,devise
,**carrierwave
**を使って
twitteのプロフィール情報(:name, :image)を取得する機能を実装しておりました。
twitter認証
を使って取得する際にprofile画像(auth.info.image)
がnull
で返ってきてしまい大変ハマってしまったのですが解決できたので解決方法を載せておきます。
画像が保存される先はuploads/tmpになております。
注意:twitter認証時に取得した画像はuploads/tmpに保存される構成です。
uploads/tmp以外のフォルダに保存されるような実装はしていませんのでご理解の程よろしくお願いします。
##Userの[image]がnullで返ってくる
- user.image = auth.info.image (nullが返ってくる。)
- デフォルトでアイコン画像が入るようにしているので
image
にはpresence: true
にはしておりません。
##環境##
rails (5.2.4.1)
carrierwave (2.1.0)
devise (4.7.1)
omniauth-twitter (1.4.0)
##omniauth-twitter+devise
Devise
とomniauth-twitter
の実装手順は省略します。
実装手順を確認したい方は
こちらを確認してください。
ハマった部分は少し載せます。、、
上記Linkのoverviewのコードではこのようになってます↓
#アバター用のアップローダーをユーザーモデルに紐付け
mount_uploader :image, AvatarUploader
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0, 20]
user.name = auth.info.name
user.image = auth.info.image #←ここ! nullが返ってきた。or #ActionDispatch::Cookies::CookieOverflow が返ってきた。
end
private
# メールアドレスはダミーのメールアドレスを作成します
def self.dummy_email(auth)
"#{auth.uid}-#{auth.provider}@example.com"
end
end
##解決方法
原因はcarrierwave,Overviewの
Uploading files from a remote location
に記載されている事の確認不足でした。
解決方法はいたって簡単でした。
user.image
or image:
にuser.remote_image_url
orremote_image_url
に変更すればいいだけです。
carrierwaveのアップローダーを:image
にマウントさせてるのでクロスドメインで情報を取得する場合は:image
の部分を変更してあげる必要があります
###carrierwaveの使う時のkey:の書き方
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = User.dummy_email(auth)
user.password = Devise.friendly_token[0, 20]
user.name = auth.info.name
user.image = auth.info.image #←ここを
user.remote_image_url = auth.info.image #に変更してあげる
end
key:に値を入れるパターンも一緒です。
def self.from_callback(auth)
user = User.where(provider: auth.provider, uid: auth.uid).first
unless user
user = User.create(
email: User.dummy_email(auth),
password: Devise.friendly_token[0, 20],
name: auth.info.name,
image: auth.info.image #←ここを
remote_image_url: auth.info.image #に変更する
end
user
end
)
これでクロスドメイン経由でtwitterのprofile画像が取得できました。