简体   繁体   中英

after_sign_in_path_for(resource) devise + facebook omniauth

My user model has birthday and I'm trying to redirect to the edit page if it is blank after signing in with Facebook. I tried overriding the after_sign_in_path for resource but keep getting this error:

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

My Application controller:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  def after_sign_in_path_for(resource)
    stored_location_for(resource) ||
    if resource.birthday.blank?
      redirect_to edit_user_path(resource)
    end
    super
  end
end

and my Omniauth controller:

class OmniauthCallbacksController < ApplicationController
  skip_before_filter :authenticate_user!

  def provides_callback_for
    user = User.from_omniauth(env["omniauth.auth"], current_user)
    if user.persisted?
      flash[:notice] = "You have signed in!"
    sign_in_and_redirect(user)
    else
      session['devise.user_attributed'] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  def failure
    flash[:notice] = "Something went wrong!"
    redirect_to root_path
  end

  alias_method :facebook, :provides_callback_for
end

This should do the trick:

def after_sign_in_path_for(resource)
    if resource.birthday.blank?
      edit_user_registration_url
    else
      super
    end
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM