如何在注册和身份验证失败时重定向Devise?

时间:2014-12-16 23:00:45

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我想要的是,如果有人在注册或登录时输入错误的信息,重定向到默认以外的其他页面,请说mycontroller#index 在我的应用程序中,我已经过度使用Devise::SessionsControllerDevise::RegistrationsController。我按照此链接Devise redirect after login fail中的步骤操作  但我仍然被重定向到注册页面并登录页面。我正在使用Rails 3.2和Devise 3.4.1 这是我的代码....我做错了什么或错过了什么?提前谢谢你。

会话控制器

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

注册控制器

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

应用程序控制器

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)

1 个答案:

答案 0 :(得分:0)

如果您想关注Devise redirect after login fail链接,则应将其添加到config / initializers / devise.rb

config.warden do |manager|
  manager.failure_app = CustomFailure
end
相关问题