前提条件
バージョンは下記になります。
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
Rails 5.2.0
実現したいこと
ルーティングの名前空間を分けた上で、Twitter認証を実装したいです。
発生している問題・エラーメッセージ
表示されているエラー文は下記になります。。
NameError at /playground/users/auth/twitter/callback uninitialized constant Users
該当のソースコード
全体としては下記のサイトを参照しました。
https://qiita.com/kami_zh/items/94aec2d94a2b4e9a1d0b
該当のソースコードは下記になります。
【app-name/config/routes/playground/routes.rb】
ruby
1Rails.application.routes.draw do 2 devise_for :users, path: :playground, controllers: { omniauth_callbacks: "playground/users/omniauth_callbacks" } 3 namespace :playground do 4 resources :samples, only: :index do 5 member do 6 end 7 collection do 8 get :○○ 9 end 10 end 11 end 12end
上のルーティングは下記サイトを参考に実装しました。
http://katahirado.hatenablog.com/entry/2014/08/16/180718
https://qiita.com/kawasakiatsushi/items/8209a979d86ab3468799
【app-name/app/models/user.rb】
ruby
1class User < ApplicationRecord 2 3 def self.from_omniauth(auth) 4 # userを暫定情報で登録してからsnsを登録する 5 sns = Sns.where(type: auth[provider], account_name: auth[nickname]).first 6 user = User.where(id: sns.user_id).first 7 8 unless user 9 ActiveRecord::Base.transaction do 10 user = User.register_user(auth) 11 user.register_sns(auth) 12 end 13 end 14 15 user 16 end 17 18 # userテーブルに登録 19 def register_user(auth) 20 user = create( 21 name: auth[:info][:name], 22 email: User.dummy_email(auth), 23 password: Devise.friendly_token[0, 20], 24 ) 25 end 26 27 # snsの種別を判定しsnsテーブルに登録する 28 def register_sns(auth) 29 provider = auth[:provider] 30 if provider == "twitter" 31 sns.create( 32 type: provider, 33 follower: auth[:extra][:raw_info][:followers_count], 34 account_name: auth[:info][:nickname], 35 link: auth[:info][:urls][:Twitter] 36 ) 37 elsif provider == "facebook" 38 sns.create( 39 # type: provider 40 ) 41 elsif provider == "google" 42 sns.create( 43 # type: provider 44 ) 45 end 46 end 47 48 private 49 50 def self.dummy_email(auth) 51 "#{auth.uid}-#{auth.provider}@example.com" 52 end 53end
【app/controllers/playground/users/omniauth_callbacks_controller.rb】
ruby
1class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 3 def twitter 4 callback_from(twitter) 5 end 6 7 # コールバック処理 8 def callback_from(provider) 9 provider = provider.to_s 10 11 @user = User.find_for_oauth(request.env['omniauth.auth']) 12 13 if @user.persisted? 14 # フラッシュメッセージの表示 15 flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize) 16 sign_in_and_redirect @user, event: :authentication 17 else 18 # ここにコールバックされた値が入っている 19 session["devise.#{provider}_data"] = request.env['omniauth.auth'] 20 redirect_to new_user_registration_url 21 end 22 end 23end
試したこと
クラス名やファイル名が命名規則に合っていないのではないかと思い、下記のサイトを参照しながらクラス名のsを外したりつけたり
ルーティングを見直しましたが解決できませんでした。
https://teratail.com/questions/89697
どなたか解決方法をご教示いただけますと幸いです。
よろしくお願い致します。
あなたの回答
tips
プレビュー