Devise报错时登录相关页面意外渲染Navbar问题求助
问题根因
- Devise 验证失败时不会触发重定向,而是直接在当前请求的路由下渲染对应错误视图:比如登录表单提交到
POST /users/sign_in路径,验证失败时 Devise 直接在这个路径下渲染登录页模板,不会跳转回GET /users/sign_in的登录路径 - 你使用的
current_page?(new_user_session_path)仅匹配GET /users/sign_in路径,验证失败时当前路径已经变成了 POST 请求的路径,判断返回 false,因此渲染 Navbar 的排除条件失效,Navbar 就会意外显示
修复方案
推荐直接用 Devise 自带的 devise_controller? 辅助方法判断,只要是 Devise 相关的控制器页面都不渲染 Navbar,不受请求方法和路径变化影响:
<%= render "shared/navbar" unless devise_controller? %>
如果需要更细粒度控制,只排除特定的 Devise 动作,可以结合控制器和动作判断:
<%= render "shared/navbar" unless (controller.is_a?(Devise::SessionsController) && %w[new create].include?(action_name)) || (controller.is_a?(Devise::RegistrationsController) && %w[new create].include?(action_name)) || (controller.is_a?(Devise::PasswordsController) && %w[new create edit update].include?(action_name)) %>
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

