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

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

ただいまの
回答率

87.34%

rails Google OAuth omniauth-google-oauth2 idがnilになる

解決済

回答 1

投稿 編集

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

score 37

実現したいこと

omniauth-google-oauth2を使用したログインフォームの作成 ↓のようなイメージです
イメージ説明

前提

モデル: Host
Host(id: integer, name: string, password_digest: string, created_at: datetime, updated_at: datetime, admin: boolean, provider: string, uid: string, image: string, oauth_token: string, oauth_expires_at: datetime, email: string)

コントローラー: session

のような構成になっております。

コード

session_controller.rb

class SessionController < ApplicationController
  skip_before_action :login_required

  def new
  end

  def create
    host = Host.find_by(name: session_params[:name])

    if host&.authenticate(session_params[:password])
      session[:host_id] = host.id
      redirect_to root_path
    else
      render :new
    end
  end

  #google認証
  def create_g
    host = Host.from_omniauth(request.env["omniauth.auth"])
    if host.save
      session[:host_id] = host.id
      redirect_to root_path
    else
      render :new
    end
  end

  def destroy
    reset_session
    redirect_to root_path
  end

  private
  def session_params
    params.require(:session).permit(:name, :password)
  end

session/new.html.erb

<div class="container">
  <%= form_with scope: :session, local: true do |f| %>
      <%= f.label :name, '名前'' %>
      <%= f.text_field :name, class: 'form-control',id: 'session_name'%>
      <%= f.label :password, 'パスワード' %>
      <%= f.password_field :password, class: 'form-control',id: 'session_password'%>
    <%= f.submit 'ログイン', class: 'btn btn-info' %>
  <% end %>
  <%= link_to "googleアカウントでログイン", "/auth/google_oauth2", id: "sign_in", method: :post %>

config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']
end

models/host.rb

class Host < ApplicationRecord
    def self.from_omniauth(auth)
      where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |host|
        host.provider = auth.provider
        host.uid = auth.uid
        host.name = auth.info.name
        host.email = auth.info.email
        host.image = auth.info.image
        host.oauth_token = auth.credentials.token
        host.oauth_expires_at = Time.at(auth.credentials.expires_at)
        return host
      end
    end
end

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

<%= link_to "googleアカウントでログイン", "/auth/google_oauth2", id: "sign_in", method: :post %>)
上記リンクを踏んでgoogleアカウントでログインを実施するとhostの中身が
下記のようにid:nilとなってしまいます。
host.idでsessionを作成しているため、idがnilだとログイン出来ません

※不必要なところは略としてあります 

 id: nil,
 name: "略",
 password_digest: nil,
 created_at: nil,
 updated_at: nil,
 admin: false,
 provider: "google_oauth2",
 uid: "略",
 image: "略",
 oauth_token:
  "略",
 oauth_expires_at: Mon, 22 Jul 2019 00:29:44 JST +09:00,
 email: "略"

質問

・idをnilではなくすにはどのようにしたら良いのでしょうか?
・または,idの問題と関係なくスマートにログインフォーム実装する方法ありますでしょうか?

補足情報(FW/ツールのバージョンなど)

ruby 2.4.5p335 (2018-10-18 revision 65137) [x64-mingw32]
Rails 5.2.3

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

・saveの前はidはnilです。
・save時にidが割り振られます。
・saveの前にpryで確認していたのでidがnilでした。
・ロールバックの原因知りたい場合save!とすればロールバックの要因が出て分かりやすいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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