前提・実現したいこと
Railsの開発で、deviseとomniauth-facebookのgemを利用して
facebookアカウントでのouthログインを実現させたいと思っております。
シンプルにfacebook outh でログインする方法は調べたので実装できるのですが、
開発しているwebアプリのアカウント新規作成に制約があって、頭を抱えております。
その制約ですが、アカウント新規作成時にラジオボタンを使ってアンケートをしています
(xxxに興味ありますか? はい・いいえ みたいなアンケートです)。
このアンケート結果がUserのカラムとなっていて(仮にカラム名:questionnaireとします)、validationになっています。
したがって、ラジオボタンのアンケートに回答している状態で「facebookでサインアップ」のボタンを押すという仕様にしたいと考えております。
<%= form_tag user_facebook_omniauth_authorize_path do %> <%= radio_button ・・・ <%= radio_button ・・・ <%= submit_tag "Facebookでサインアップ", class: "create_btn" %>
こんな感じのコード書き、omniauth_callbacks_controller.rbのfacebookアクションにパラメーターを渡し、
user.questionnaire = params[xxx] みたいな形で実装したいと考えています。
###問題点
試みましたが、どうやら期待しているparamsがuser_facebook_omniauth_authorize_pathまで
運ばれていないようです。
omniauth-facebookで使用するファイル
user.rb
class User < ApplicationRecord ・ ・ ・ #omniauth-callback def self.from_omniauth(auth) where(provider: auth.provider, uid: auth.uid).first_or_create do |user| user.email = auth.info.email user.password = Devise.friendly_token[0,20] user.name = auth.info.name # assuming the user model has a name # user.picture = auth.info.image # assuming the user model has an image # If you are using confirmable and the provider(s) you use validate emails, # uncomment the line below to skip the confirmation emails. user.skip_confirmation! end end end
omniauth_callbaks_controller.rb(binding.pry置いてdebug出来るようにしてます)
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController def facebook # You need to implement the method below in your model (e.g. app/models/user.rb) @user = User.from_omniauth(request.env["omniauth.auth"]) binding.pry if @user.persisted? sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated set_flash_message(:notice, :success, kind: "Facebook") if is_navigational_format? elsif @user.invalid? redirect_to facebook_signup_path else session["devise.facebook_data"] = request.env["omniauth.auth"] redirect_to new_user_registration_url end end def failure redirect_to root_path end end
試したこと
facebook アクションにbinding.pryを置いてデバックしてみると、該当するparamsはありませんでした。
debug
1[1] pry(#<Users::OmniauthCallbacksController>)> params 2=> <ActionController::Parameters {"code"=>"AQCRPlgUGFpl6PWveKxfioddk7CZZ5Du5XSgBI5durfGdg4IoqQLL6FK5Srb2wLN1PMt3pBlZqdJlxKtjS_iyktLzRvEbGz79Q6EJwB8dwq6e-_fBoWDKqmhuFs5j3HqDixi4esl8GPVvbJHAt_xWfxVyoCa7X-tN2eyNXabw79mGc3L3T-eoyWBIm5OuUiFuze48tVNf8bvShV5P87l4wkcqeWrwGt2u3S8jmXXMG2Jxr6JT_3_WCm-PllGuvMd6_i26bWLilJL7cl-uohJ9s8iWgq68Tdxarx-5gipX8WoWHPSH1BxM3fiIn4WNBwPUpVzhXpmx6QJ2GIo5_fOJzbb", "state"=>"42568dbcc6be05d2436f7b3f3d27cfa0ae834d55a8d64091", "controller"=>"users/omniauth_callbacks", "action"=>"facebook"} permitted: false
しかし、<%= form_tag user_facebook_omniauth_authorize_path do %>のパスを、
例えばroot_path などにしてみると、きちんと期待したパラメーターが運ばれていました。
この原因は何なのでしょうか?
deviseのcallbackでパラメーターを破棄しているのでしょうか?
また、formでパラメーターをfacebook callbackに渡すことは可能なのでしょうか??
補足情報(FW/ツールのバージョンなど)
ruby: 2.5.3
rails: 5.2.2
devise: 4.6.1
omniauth-facebook: 5.0.0
あなたの回答
tips
プレビュー