2016-11-29 8 views
0

Я использую devise gem вместе с omniauth gem для Facebook, Twitter & Instagram. Ниже в gem «s я использую:Ruby on rails - Перенаправить на предыдущий URL-адрес после аутентификации с помощью dev//// omniauth

gem 'devise' 
gem 'omniauth' 
gem 'omniauth-twitter' 
gem 'omniauth-facebook' 
gem 'omniauth-instagram' 
gem 'twitter' 
gem 'instagram' 

Я последовал за this toturial Настройка Завещание с Twitter и Facebook.

Внутри моей omniauth_callbacks_controller.rb я настроил generic_callback функцию следующим образом:

def generic_callback(provider) 
    @identity = Identity.find_for_oauth env["omniauth.auth"] 
    @user = @identity.user || current_user 
    if @user.nil? 
     @tempUser = User.find_by_email(@identity.email) unless @identity.email.blank? 
     if @tempUser.nil? 
      @user = User.create(email: @identity.email, display_name: @identity.display_name, avatar: @identity.avatar, provider: @identity.provider || nil) 
     else 
     @user = @tempUser 
     end 
     @identity.update_attribute(:user_id, @user.id) 
    end 
    if @user.email.blank? && @identity.email 
     @user.update_attribute(:email, @identity.email) 
    end 
    if @user.persisted? 
     @identity.update_attribute(:user_id, @user.id) 

     @user = FormUser.find @user.id 
     sign_in_and_redirect @user, event: :authentication 
     set_flash_message(:notice, :success, kind: provider.capitalize) if is_navigational_format? 
    else 
     session["devise.#{provider}_data"] = env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

Все работает отлично, и что я хочу добиться, чтобы перенаправить пользователь предыдущий URL когда они sign_in или sign_up.

Перед установкой omniauth gem и используется только devise gem, я использовал этот метод в моем application_controller.rb:

def after_sign_in_path_for(resource) 
    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/ || request.fullpath =~ /\/macbook1/ 
end 

Это было волшебство при использовании только devise, но теперь, если этот метод внутри application_controller.rb я получаю эту ошибку :

Error after sign_in or sign_out

Я также попытался это с ошибкой:

def after_sign_in_path_for(resource_or_scope) 
    if request.env['omniauth.origin'] 
     request.env['omniauth.origin'] 
    end 
    end 

Что мне нужно сделать, чтобы быть в состоянии redirect пользователя предыдущий URL после sign_in или sign_up?

ответ

0

Внутри application_controller.rb вам нужны 2 метода: store_location & after_sign_in_path_for.

application_controller.rb

class ApplicationController < ActionController::Base 
    after_filter :store_location 

    def store_location 
     return unless request.get? 
     if (request.path != new_user_session_path && 
      request.path != new_user_registration_path && 
      request.path != "https://stackoverflow.com/users/password/new" && 
      request.path != "https://stackoverflow.com/users/password/edit" && 
      request.path != "https://stackoverflow.com/users/confirmation" && 
      request.path != "https://stackoverflow.com/users/edit" && 
      request.path != destroy_user_session_path && 
      !request.xhr?) # don't store ajax calls 
     session[:previous_url] = request.fullpath 
     end 
    end 

    def after_sign_in_path_for(resource) 
     request.env['omniauth.origin'] || stored_location_for(resource) || root_path || request.fullpath =~ /\/admin/ 
    end 

end