5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails6 OmniAuth activestorage ユーザー画像を取得する 追記あり

Last updated at Posted at 2020-09-27

永遠の初心者による自分のためのメモ。
Rails学習開始3ヶ月。
とりあえずこれで動きました程度に考えていただければ幸いです。
こうした方がええやんと言うご意見がある方は優しいコメント頂けると嬉しいです。

この記事の目的

active storageにユーザーのプロフィール画像を保存する。
ググってみてもcarrierwaveばかりでactive storageの記事をあまり見かけなかったので、同じ境遇の人がいればと思い投稿ました。

環境

Ruby 2.7.1p83 Rails 6.0.3.3

前提条件

deviseによるログイン機能実装済み。

OmniAuthによるTwitter、google、facebookなどのログイン認証機能実装済み。

私は、以下の記事を参考にさせて頂きました

・手続き関連 https://qiita.com/kazuooooo/items/47e7d426cbb33355590e ・OmniAuth導入 https://qiita.com/LuckHackMahiro/items/9dfca6e67777a2161240

参考

・active storageに画像URLを保存する方法 https://qiita.com/gomasio1010/items/09c6ee58ed4c95f109ff

とても助かりました!ありがとうございます。

active storageに画像urlを保存する

機能実装できている前提で、
user.rb

require "open-uri"  #ここ
class User < ApplicationRecord

  #省略

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.password = Devise.friendly_token[0, 20]
      user.email = auth.info.email    
      user.email = User.dummy_email(auth) if user.provider == "twitter" 
      avatar = open("#{auth.info.image}") #ここ
      user.image.attach(io: avatar, filename: "user_avatar.jpg") #ここ
    end
  end

 #省略

end

記事を参考に画像を取得する事ができました。
active storageでの記事はあまり見かけなかったので、とても助かりました。

画像が小さくて、荒くなるとの噂でしたので、サイズが大きくなりそうな感じにしてみました。
色々見ているとモデル側で指定している方もいらっしゃいました。

config/initializers/devise.rb

devise.rb

  config.omniauth :facebook, ENV['FACEBOOK_ID'], ENV['FACEBOOK_SECRET_KEY'], :image_size => 'large'#これ
  config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']
  config.omniauth :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET_KEY'], callback_url: "http://localhost:3000/users/auth/twitter/callback", :image_size => 'original'#これ

ログイン認証関連の実装は、時間帯によってうまくいかなかったり、ブラウザにcookieが残っていると正しく動かない時がありましたので気長にやると良さそうです。

その後、、、。

RSpecで警告がでてたので、
warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open

#google翻訳
# 警告:Kernel#openを介したURI.openの呼び出しは非推奨です。URI.openを直接呼び出すか、URI#openを使用してください。

下記のように修正。

user.rb
  # require "open-uri" を消す
  def self.first_or_create_from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.password = Devise.friendly_token[0, 20]
      user.email = auth.info.email
      user.email = User.dummy_email(auth) if user.provider == "twitter"
      url = URI.parse("#{auth.info.image}")  #imageのURL
      avatar = url.open  #警告に従う
      user.image.attach(io: avatar, filename: "user_avatar.jpg")
    end
  end

こちらの質問がドンピシャでした!ありがとうございます!
Railsアクティブストレージを使用してURLから画像を保存するにはどうすればよいですか?

テストも無事に通ったので、一件落着。。。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?