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

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

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

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Ruby on Rails

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

629閲覧

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

naoki10

総合スコア37

Ruby on Rails 5

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Ruby on Rails

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2019/07/21 14:46

編集2019/07/21 14:47

実現したいこと

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

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

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

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

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

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

guest

回答1

0

自己解決

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

投稿2019/07/22 11:45

naoki10

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問