質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

NameError at /playground/users/auth/twitter/callback uninitialized constant Usersというエラーが発生しています

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 101

ToruOkada

score 10

 前提条件

バージョンは下記になります。

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】

Rails.application.routes.draw do
  devise_for :users, path: :playground, controllers: { omniauth_callbacks: "playground/users/omniauth_callbacks" }
  namespace :playground do
    resources :samples, only: :index do
      member do
      end
      collection do
        get :○○
      end
    end
  end
end


上のルーティングは下記サイトを参考に実装しました。
http://katahirado.hatenablog.com/entry/2014/08/16/180718
https://qiita.com/kawasakiatsushi/items/8209a979d86ab3468799

【app-name/app/models/user.rb】

class User < ApplicationRecord

   def self.from_omniauth(auth)
        # userを暫定情報で登録してからsnsを登録する
        sns = Sns.where(type: auth[provider], account_name: auth[nickname]).first
        user = User.where(id: sns.user_id).first

        unless user
            ActiveRecord::Base.transaction do
                user = User.register_user(auth)
                user.register_sns(auth)
            end
        end

        user
    end

    # userテーブルに登録
    def register_user(auth)
        user = create(
            name:      auth[:info][:name],
            email:     User.dummy_email(auth),
            password:  Devise.friendly_token[0, 20],
            )
    end

    # snsの種別を判定しsnsテーブルに登録する
    def register_sns(auth)
        provider = auth[:provider]
        if provider == "twitter" 
            sns.create(
                type:          provider,
                follower:      auth[:extra][:raw_info][:followers_count],
                account_name:  auth[:info][:nickname],
                link:          auth[:info][:urls][:Twitter]
            )
        elsif provider == "facebook"
            sns.create(
                # type:      provider
            )
        elsif provider == "google"
            sns.create(
                # type:      provider
            )
        end
    end

    private    

    def self.dummy_email(auth)
        "#{auth.uid}-#{auth.provider}@example.com"
    end
end

【app/controllers/playground/users/omniauth_callbacks_controller.rb】

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

    def twitter
        callback_from(twitter)
    end

    # コールバック処理
    def callback_from(provider)
        provider = provider.to_s

        @user = User.find_for_oauth(request.env['omniauth.auth'])

        if @user.persisted?
            # フラッシュメッセージの表示
            flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize)
            sign_in_and_redirect @user, event: :authentication
        else
            # ここにコールバックされた値が入っている
            session["devise.#{provider}_data"] = request.env['omniauth.auth']
            redirect_to new_user_registration_url
        end
    end
end

 試したこと

クラス名やファイル名が命名規則に合っていないのではないかと思い、下記のサイトを参照しながらクラス名のsを外したりつけたり
ルーティングを見直しましたが解決できませんでした。
https://teratail.com/questions/89697

どなたか解決方法をご教示いただけますと幸いです。
よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る