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

标签 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 这是我的代码....我做错了什么或遗漏了什么?提前谢谢你。

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/

相关文章:

ruby - 一个 Ruby 对象可以有多个特征类吗?

ruby - 除了数组值之外,如何使用散列?或者如何创建哈希线?

ruby - 使用 Proc.call 与 Proc.[] 是否存在 Ruby 优先级问题?

ruby-on-rails - Meteor,如何从外部源获取 'Post' 数据?

ruby-on-rails - 如何在select中命名空白值?

ruby-on-rails - 使用 PostgreSQL 时如何安全地将参数传递给 ActiveRecord#select()

ruby-on-rails - 在保存到 Rails 之前如何更改回形针模型文件中的图像名称?

ruby-on-rails-3 - Rspec cookies.permanent,未定义方法

ruby-on-rails - Rails 中的唯一搜索结果

ruby-on-rails - ActiveResource 应忽略根 xml 元素