###前提・実現したいこと
今回初めて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
あなたの回答
tips
プレビュー