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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

202閲覧

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

ToruOkada

総合スコア16

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/06/30 09:42

前提条件

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問