注销设计轨道时重定向

时间:2017-01-17 10:08:04

标签: ruby-on-rails devise

Rails 4.2和Devise 5

我在我的application_controller.rb上使用此code,以便在用户退出时将用户重定向到同一页面

def after_sign_out_path_for(resource_or_scope)
   request.referrer || root_path
end

一切正常,当用户点击退出时,他们会退出并停留在同一页面上。

但是,如果用户尝试注销失败的验证编辑配置文件*,则应用程序将抛出错误。日志说" ActionController :: RoutingError(没有路由匹配[GET]" / users")。

有任何改进代码的想法吗?

*(例如,当用户尝试更改用户名并且已经使用时,表单会显示验证错误并且用户已退出)

2 个答案:

答案 0 :(得分:0)

要解决您的问题,您可以处理这样的路由错误:

class ApplicationController < ActionController::Base
  rescue_from ActionController::RoutingError, with: :handle_routing_error

  # added
  def routing_error
    raise ActionController::RoutingError.new(params[:path])
  end

  private

    def handle_routing_error
      redirect_to root_path, alert: "some alert text"
    end
end

接下来添加Rails.application.routes.draw

routes.rb块的非常结束
match "*path", to: "application#routing_error", via: :all

因此,如果您没有上次访问过的url,则返回root_path。如果你确实有最后访问过的网址,那就很好了,你就回去了。如果不好(比如验证的用例),则返回root_path。

答案 1 :(得分:0)

你可以这样做,

def after_sign_out_path_for(resource_or_scope)
  if current_user
    request.referrer
  else
    root_path
  end
end

但我所做的是在application_controller.rb中使用相同的after_sign_out_path_for方法

application_controller.rb

def after_sign_out_path_for(resource_or_scope)
  request.referrer || root_path
end

然后在控制器中添加before_action :authenticate_user!回调,其中包含需要user的所有方法。像这样,

users_controller.rb

class UsersController < ApplicationController
  before_action :authenticate_user!, only: [:show, :edit, :update, :destroy]

  def show
  end

end

这样,当用户在编辑个人资料页面上退出时,它会尝试将他重定向到同一页面,但在edit users_controller.rb之前调用before_action操作之前正在调用,用户将自动重定向到登录页面。

这绝对是我喜欢的,但你可能不需要它,所以你应该选择第一个解决方案。