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

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

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

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

Ruby on Rails

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

Q&A

0回答

2162閲覧

Rails5 deviseでTwitter認証→サインアップ画面→入力内容確認画面→登録 という流れで、Twitter認証データがUserレコードに保存されない

退会済みユーザー

退会済みユーザー

総合スコア0

Devise

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/05/24 10:28

###前提・実現したいこと
今回初めてRubyにたずさわり、勉強しながらdeviseを使用してサインアップ画面を作成しています。
その際、Twitter認証 → サインアップ画面 → ユーザー情報入力 → 入力内容確認 → 登録 という流れで作成したいと思っています。

前提として、deviseの設定、viewとcontrollerの追加、メール認証は、下記の参考にしたサイトを元に実装し、エラーなく保存できるようになっています。
そこへTwitter認証を追加して、Twitter認証後に続けてサインアップ画面へ遷移し、ユーザー情報(名前、住所等)を入力させています。

現状、Twitter認証後、views/users/registrations/new.html.erb の画面へ遷移したタイミングでは、@user内にuid, provider, nicknameの数値が入っているのをデバッグモードで確認できました。

その後、registrations_controller で確認画面(views/users/registrations/confirm.html.erb)へ遷移した際に、uid, provider, nicknameの値はNULL になってしまい、Userテーブルのuid等はすべてNULLでレコードが作成されてしまう状態で止まっております。

###ここまで参考にしたサイト
[Rails] deviseの使い方(rails5版)
上記サイトを参考に作成しました。
違う箇所は、Userモデルの他にAddressモデルがあり、そちらにも同時に保存させるようにRegistrations_controllerをカスタムしています。

###謝辞
初めて質問させていただきますので、わかりづらい説明となってしまいましたら申し訳ございません。
必要な情報等は追加させていただきますので、教えていただけますと幸いです。
何卒お力添えをお願いいたします。

以下、現在のコードです。

Ruby

1# routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users, path: '/', controllers: { 5 confirmations: 'public/users/confirmations', 6 passwords: 'public/users/passwords', 7 registrations: 'public/users/registrations', 8 sessions: 'public/users/sessions', 9 unlocks: 'public/users/unlocks', 10 omniauth_callbacks: 'public/users/omniauth_callbacks' 11 } 12 13 devise_scope :user do 14 post 'sign_up/confirm' => 'public/users/registrations#confirm' 15 post 'sign_up/complete' => 'public/users/registrations#complete' 16 get 'passwords/complete_mailer' => 'public/users/passwords#complete_mailer' 17 get 'passwords/complete' => 'public/users/passwords#complete' 18 end 19 20 scope module: :public do 21 get '/' => 'home#index' 22 get '/mypage' => 'mypage#mypage' 23 end 24 25 root 'public/home#index' 26 27end

Ruby

1# public/users/omniauth_callbacks_controller.rb 2 3class Public::Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 4 layout "public/application" 5 6 def twitter 7 @user = User.from_omniauth(request.env["omniauth.auth"].except("extra")) 8 if @user.persisted? 9 sign_in_and_redirect @user 10 else 11 session["devise.user_attributes"] = @user.attributes 12 redirect_to new_user_registration_url 13 end 14 end 15 16end

Ruby

1# public/users/registrations_controller.rb 2 3class Public::Users::RegistrationsController < Devise::RegistrationsController 4 layout "public/application" 5 6 before_action :configure_sign_up_params, only: [:create] 7 before_action :configure_account_update_params, only: [:update] 8 9 def confirm 10 user = User.new(user_params) 11 if user.valid? 12 render :action => 'confirm' 13 else 14 render :action => 'new' 15 end 16 end 17 18# UserとAddressの二つのテーブルへそれぞれ保存し、UserテーブルへAddressのIDを渡しています。 19 def complete 20 @user = User.create(user_params) 21 @address = address_create 22 @user[:default_address] = @address[:id] 23 @user.save 24 render :action => 'complete' 25 end 26 27 private 28 def user_params 29 params.require(:user).permit(:last_name, 30 :first_name, 31 :last_name_kana, 32 :first_name_kana, 33 :phone_number, 34 :email, :password, 35 :password_confirmation, 36 :address_zip, 37 :address_prefecture, 38 :address_city, 39 :address_town, 40 :address_building) 41 end 42 43 def address_create 44 Address.create(zip: user_params[:address_zip], 45 prefecture: user_params[:address_prefecture], 46 city: user_params[:address_city], 47 town: user_params[:address_town], 48 building: user_params[:address_building], 49 user_id: @user[:id]) 50 end 51 52end 53

Ruby

1# public/users/registrations/new.html.erb 2 3<h2>新規登録</h2> 4 5<%= form_for(resource, as: resource_name, url: {action: "confirm"}) do |f| %> 6 <%= devise_error_messages! %> 7 8<%= debug @user %> 9 10 <div class="field"> 11 <%= f.label :お名前(姓) %> 12 <%= f.text_field :last_name, autofocus: true %> 13 </div> 14 15〜 省略 〜 16 17 <!-- 入力内容確認ページへ --> 18 <div class="actions"> 19 <%= f.submit "次へ" %> 20 </div> 21<% end %>

Ruby

1# public/users/registrations/confirm.html.erb 2 3<h2>内容確認画面</h2> 4 5<%= form_for(resource, as: resource_name, url: {action: 'complete'}) do |f| %> 6 <%= devise_error_messages! %> 7 <%= debug @user %> 8 9 <div class="field"> 10 <%= f.label :お名前(姓) %> 11 <%= f.hidden_field :last_name %> 12 <%= @user.last_name %> 13 </div> 14 15〜 省略 〜 16 17 <!-- 入力内容確認ページへ --> 18 <div class="actions"> 19 <%= f.submit "登録" %> 20 </div> 21<% end %> 22

###補足情報
ruby 2.4.0
rails 5.0.1
MySQL

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問