実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
・saveの前はidはnilです。
・save時にidが割り振られます。
・saveの前にpryで確認していたのでidがnilでした。
・ロールバックの原因知りたい場合save!とすればロールバックの要因が出て分かりやすいです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる