我想要的是,如果有人在注册或登录时输入了错误的信息,将被重定向到默认页面以外的其他页面,比如 mycontroller#index
在我的应用程序中,我已经覆盖了 Devise::SessionsController
和 Devise::RegistrationsController
。我按照此链接 Devise redirect after login fail 中的步骤操作
但我仍然被重定向到注册页面和登录页面。我正在使用 Rails 3.2 和 Devise 3.4.1
这是我的代码....我做错了什么或遗漏了什么?提前谢谢你。
session Controller
class SessionsController < Devise::SessionsController
def create
resource = warden.authenticate!(:scope => resource_name, :recall => "# {controller_path}#failure")
sign_in_and_redirect(resource_name, resource)
end
def sign_in_and_redirect(resource_or_scope, resource=nil)
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
sign_in(scope, resource) unless warden.user(scope) == resource
return render :json => {:success => true}
end
def failure
return render :json => {:success => false, :errors => ["Login failed."]}
end
end
注册 Controller
class RegistrationsController < Devise::RegistrationsController
def create
build_resource
if resource.save
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
sign_up(resource_name, resource)
return render :json => {:success => true}
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
expire_session_data_after_sign_in!
return render :json => {:success => true}
end
else
clean_up_passwords resource
return render :json => {:success => false}
redirect_to {:controller=>"deal",:action=>"confirm_and_pay"}
end
end
def sign_up(resource_name, resource)
sign_in(resource_name, resource)
end
end
路线
devise_for :users, :skip => [:registrations, :sessions]
devise_scope :user do
get 'signup' => 'devise/registrations#new', :as => :new_user_registration
post 'signup' => 'devise/registrations#create', :as => :user_registration
get 'users/cancel' => 'devise/registrations#cancel', :as => :cancel_user_registration
get 'users/edit' => 'devise/registrations#edit', :as => :edit_user_registration
put 'users' => 'devise/registrations#update'
delete 'users/cancel' => 'devise/registrations#destroy' ,:as=>:destroy_user_session
get 'signin' => 'devise/sessions#new', :as => :new_user_session
post 'signin' => 'devise/sessions#create', :as => :user_session
get 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session
end
应用 Controller
class ApplicationController < ActionController::Base
protect_from_forgery
def after_sign_up_path_for(resource)
show_deals_path(resource)
end
def after_sign_in_path_for(resource)
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
if request.referer == sign_in_url
super
else
stored_location_for(resource) || request.referer || root_path
end
end
end
lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
def redirect_url
redirect_to {:controller=>"mycontroller",:action=>"index"}
end
def respond
if http_auth?
http_auth
else
redirect
end
end
end
application.rb
config.autoload_paths += %W(#{config.root}/lib)
最佳答案
如果你想关注Devise redirect after login fail链接,你应该把它添加到 config/initializers/devise.rb
config.warden do |manager|
manager.failure_app = CustomFailure
end
关于ruby-on-rails - 如何在注册和身份验证失败时重定向 Devise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515534/