OmniauthのSNS認証(FB, google, twitter)機能でサムネイルを取得したい
railsでアプリを作成しており、SNS認証実装いたしました。
実装は出来ましたが、画像を取得する事を忘れており記述をしたものの、うまく出来ずアドバイス頂けると幸いです。
発生している問題・エラーメッセージ
ArgumentError in Users#show Nil location provided. Can't build URI.
エラー箇所
ruby
1<%= image_tag @user.image, class: "round-img" %>
paramsの中身がNilとなってしまいます。
gem等は使用しておりません。
これまでの実装の経緯
1.関連しているモデルとしてuser modelとsns_credidential modelがあります。
ruby
1 create_table "sns_credentials", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 2 t.string "provider" 3 t.string "uid" 4 t.bigint "user_id" 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 t.index ["user_id"], name: "index_sns_credentials_on_user_id" 8 end 9 10 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 11 t.string "email", default: "", null: false 12 t.string "encrypted_password", default: "", null: false 13 t.string "reset_password_token" 14 t.datetime "reset_password_sent_at" 15 t.datetime "remember_created_at" 16 t.datetime "created_at", null: false 17 t.datetime "updated_at", null: false 18 t.string "name" 19 t.string "image" 20 t.index ["email"], name: "index_users_on_email", unique: true 21 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 22 end 23 24 add_foreign_key "sns_credentials", "users" 25end 26
2.users_controller確認
ruby
1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:id]) 4 end 5end
3.model/user.rbのself.from_omniauth(auth)メソッドに追記
ruby
1def self.from_omniauth(auth) 2 sns = SnsCredential.where(provider: auth.provider, uid: auth.uid).first_or_create 3 user = sns.user || User.where(email: auth.info.email).first_or_initialize( 4 name: auth.info.name, 5 email: auth.info.email, 6 image: auth.info.image #←追記箇所です 7 ) 8 if user.persisted? 9 sns.user = user 10 sns.save 11 end 12 { user: user, sns: sns } 13 end
4.omniauth_callbacks_controller
ruby
1class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 def facebook 3 authorization 4 end 5 6 def google_oauth2 7 authorization 8 end 9 10 def twitter 11 authorization 12 end 13 14 def failure 15 redirect_to root_path 16 end 17 18 private 19 20 def authorization 21 sns_info = User.from_omniauth(request.env["omniauth.auth"]) 22 @user = sns_info[:user] 23 24 if @user.persisted? 25 sign_in_and_redirect @user, event: :authentication 26 else 27 @sns_id = sns_info[:sns].id 28 render template: 'devise/registrations/new' 29 end 30 end 31end
試したこと
以前も別アプリで、他のモデルのデータを引っ張る事に苦労した際、
アソシエーションやモデルの表記等の見直しで直す事が出来たため見直しをしましたが、ちょっと分からずアドバイスをお願いしたいです。
よろしくお願いいたします。
あなたの回答
tips
プレビュー