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")。
有任何改进代码的想法吗?
*(例如,当用户尝试更改用户名并且已经使用时,表单会显示验证错误并且用户已退出)
答案 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
操作之前正在调用,用户将自动重定向到登录页面。
这绝对是我喜欢的,但你可能不需要它,所以你应该选择第一个解决方案。