ご閲覧いただきまして、ありがとうございます。
Ruby on Railsで、Googleから認証したプロフィール画像を保存しようとしているのですが、なぜか remote_image_url
でおかしな挙動をしてしまっていて困っています。
エラー内容は下記です。
[3] pry(User)> user.remote_image_url = auth.info.image NoMethodError: undefined method `[]' for nil:NilClass from /Users/xxxxxx/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/carrierwave-2.0.0/lib/carrierwave/downloader/remote_file.rb:28:in `filename_from_header' [4] pry(User)> user.remote_image_url => "https://lh5.googleusercontent.com/xxxxxxxxxxx/photo.jpg"
その後、 user.remote_image_url
を叩くと表示されているのですが、その前にエラーが発生してしまうために実際のアプリケーションでは保存ができません。ユーザー認証はGoogleで、Deviseを使っています。
user.rb
ruby
1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, :confirmable, 5 :rememberable, :trackable, :timeoutable, :lockable, :recoverable, 6 :omniauthable, :timeoutable 7 8 mount_uploader :image, UserIconUploader 9 10 def self.find_for_google_oauth(auth) 11 where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 12 user.email = auth.info.email 13 user.password = Devise.friendly_token[0,20] 14 user.username = auth.info.name 15 user.remote_image_url = auth.info.image 16 user.confirmed_at = Time.now.utc 17 end 18 end
user_icon_uploader.rb
ruby
1class UserIconUploader < CarrierWave::Uploader::Base 2 include CarrierWave::MiniMagick 3 4 if Rails.env.development? || Rails.env.test? 5 storage :file 6 else 7 storage :fog 8 end 9 10 def store_dir 11 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 12 end 13 14 def default_url(*args) 15 'image.png' 16 end 17 18 process resize_to_fill: [300, 300] 19 process convert: 'png' 20 21 def extension_whitelist 22 %w[jpg jpeg gif png ico] 23 end 24 25 def filename 26 super.chomp(File.extname(super)) + '.jpg' if original_filename 27 end 28end
carrierwave.rb
ruby
1CarrierWave.configure do |config| 2 config.fog_provider = 'fog/aws' 3 config.fog_credentials = { 4 provider: 'AWS', 5 region: 'us-east-1', 6 aws_access_key_id: Rails.application.credentials.aws[:access_key_id], 7 aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key], 8 } 9 config.fog_directory = Rails.application.credentials.aws[:bucket_name] 10 config.fog_public = false 11 config.fog_attributes = { cache_control: "public, max-age=#{365.days.to_i}" } 12end 13 14CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:].\-+]/
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。