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

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

ただいまの
回答率

90.36%

  • Ruby on Rails

    8163questions

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

  • Twitter

    734questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

  • Devise

    277questions

    Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Devise内でomniauthのtwitter認証が完了してもレコードが格納されない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,301

hikaru923

score 19

前提・実現したいこと

///0222追記
すみません!そもそも「実現したい事」を書くのを忘れていました!
エラーは後述の通り「Twitter認証後データがテーブルに格納されない」ことなのですが、それを回避して
僕が意図している
「Twitter認証をして、そこから取ってきたデータをテーブル内のレコードとして格納する」事が目的です。

///以下本文
ruby on railsを用い(この表現も正確か分かりません)自分でwebページを作ってみたいと思っております。
0から作るのではなく、
Ruby on Rails チュートリアルを全行程終わらせた成果物をブラッシュアップしていく、という形です。

現在、deviseを用いてログイン機能を実装しまして
Twitterやfacebookでの認証も追加したいと思いまして
こちらの記事 [*Rails*] deviseの使い方 - Qiita
を読み、上から一つずつ進めていっています。
既にID/Passでの認証などは終わらせているので、適宜「これは既に書いた」というコードは無視して進めています。

参考にさせていただいたリファレンスにおんぶにだっこなのですが
当該記事の「アカウント登録確認メールを送る」内の「メールが実際に届くようにする」までを実装したのですが
メールが届いて無事Twitter認証も終わり!と肩の力を抜きました。

発生している問題・エラーメッセージ

ところが、ログアウト後、再度「Sign in with Twitter」を押しましたところ
Twitter側で「アプリケーションに戻ります。」というメッセージが表示され
無事認証されているなと思いきや
自サイトに戻ってきた時、アカウント登録画面に遷移してしまいます。
エラーメッセージが発生しないのでやや時間が掛かりましたが
これはどうも「twitter認証が完了した後もテーブルにデータが作成されない」から?だという事が分かりました。
前述の記事を参照させていただき、「user」部分をstudentに変え
当該studentモデル内にself.from_omniauthとself.new_with_sessionを記載しているのですが…

#  app/models/student.rb

class Student < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable,
         :omniauthable, omniauth_providers: [:twitter,:facebook]

    def self.from_omniauth(auth)
        where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |student|
            student.provider = auth["provider"]
            student.uid = auth["uid"]
            student.studentname = auth["info"]["nickname"]
        end
    end

    def self.new_with_session(params, session)
        if session["devise.student_attributes"]
            new(session["devise.student_attributes"], without_protection: true) do |student|
                student.attributes = params
                student.valid?
            end
        else
            super
        end
    end
end

ちなみに自サイトは2種類のユーザー種別がありまして、その両方にdeviseを設定しており
そのうちstudentユーザーにのみtwitter認証を実装しようとしています。
そのため一つのモデルより各種deviseのviewやcontrollerなどが複雑な構造になっています。
なので読み込むべきファイルではないものを参照しているのかな…とも思いましたが、
どこから手を付けたらいいのか判断できかねるので質問させていただきました。 

謝辞

問題解決にあたり、何か必要な情報などありましたら遠慮なくお申し付けください。随時追加させていただきます!
長文になりましたが、ここまで目を通していただき誠にありがとうございました。
何卒、お力添えをよろしくお願い申し上げます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

Devise+OmniAuthでユーザ認証を実装する手順 - Qiita

こちらに沿ってコーディングする事で無事登録されました!
ただリファレンスを紹介するだけになってしまっているような…すみません。
一つだけ工夫した点があるとすれば、外部サイトを用いた認証には
仮登録メールを介さずに即時登録となるようにしました。
(以下コードは敬意を込めて引用サイトから転載、1行コード追記)

class User < ActiveRecord::Base
  # ...

  def self.find_for_oauth(auth)
    user = User.where(uid: auth.uid, provider: auth.provider).first

    unless user
      user = User.create(
        uid:      auth.uid,
        provider: auth.provider,
        email:    User.dummy_email(auth),
        password: Devise.friendly_token[0, 20]
      )
    end
######これを追記!######
user.skip_confirmation!
#######################
    user
  end

  private

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Ruby on Rails

    8163questions

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

  • Twitter

    734questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

  • Devise

    277questions

    Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。