Ruby on rails - 在使用 devise/omniauth 验证后重定向到之前的 url
Ruby on rails - Redirect to previous url after authentication with devise/omniauth
我在 Facebook、Twitter 和 Instagram 上使用 devise gem
和 omniauth gem
。下面是我使用的gem
:
gem 'devise'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'omniauth-instagram'
gem 'twitter'
gem 'instagram'
我关注 this toturial 以使用 Twitter 和 Facebook 设置 Devise。
在我的 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
内,我会收到此错误:
我也试过这个错误:
def after_sign_in_path_for(resource_or_scope)
if request.env['omniauth.origin']
request.env['omniauth.origin']
end
end
我需要做什么才能让 redirect
用户在 sign_in 之后 上一个 url 或sign_up?
在 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 != "/users/password/new" &&
request.path != "/users/password/edit" &&
request.path != "/users/confirmation" &&
request.path != "/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
我在 Facebook、Twitter 和 Instagram 上使用 devise gem
和 omniauth gem
。下面是我使用的gem
:
gem 'devise'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'omniauth-instagram'
gem 'twitter'
gem 'instagram'
我关注 this toturial 以使用 Twitter 和 Facebook 设置 Devise。
在我的 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
内,我会收到此错误:
我也试过这个错误:
def after_sign_in_path_for(resource_or_scope)
if request.env['omniauth.origin']
request.env['omniauth.origin']
end
end
我需要做什么才能让 redirect
用户在 sign_in 之后 上一个 url 或sign_up?
在 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 != "/users/password/new" &&
request.path != "/users/password/edit" &&
request.path != "/users/confirmation" &&
request.path != "/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