永遠の初心者による自分のためのメモ。
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を保存する
機能実装できている前提で、
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
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を使用してください。
下記のように修正。
# 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から画像を保存するにはどうすればよいですか?
テストも無事に通ったので、一件落着。。。