Rails Devise Gem路由异常求助:添加Bootstrap后路由失效
看来你遇到了两个典型的Devise配置问题,我来逐个帮你排查解决:
问题1:Sign Out时报错"No route matches [GET] "/users/sign_out""
这个问题的核心是Devise默认把sign_out路由设置为DELETE请求,但你的视图里的Sign Out链接可能发送了GET请求,导致匹配不到正确的路由。
解决步骤:
修正Sign Out链接的写法:
不要直接写纯HTML的<a>标签,改用Rails的link_tohelper并明确指定method: :delete,比如在Bootstrap导航栏里写:<%= link_to "退出登录", destroy_user_session_path, method: :delete, class: "nav-link" %>(如果是Admin的退出链接,就用
destroy_admin_session_path)确保Rails UJS已加载:
非GET方法的链接需要Rails UJS的支持才能正常工作。检查你的app/assets/javascripts/application.js(Rails 5及更早)里是否包含://= require rails-ujs如果是Rails 6+用Webpack的话,在
app/javascript/packs/application.js里加上:import Rails from "@rails/ujs" Rails.start()
问题2:访问/admins/sign_up时触发UrlGenerationError
这个问题的根源在你的routes.rb和AdminRegistrationsController的配置错误:
首先修正路由配置:
看你的routes.rb里的这行:
devise_for :admins, :controllers => { admin_registrations: 'admin registrations' }
这里有两个错误:
- Devise的控制器选项键应该是Devise内置的控制器名(比如
:registrations),而不是自定义的名称 - 控制器路径里的空格是错误的,Rails会找不到对应的控制器文件(你的控制器是
AdminRegistrationsController,对应的路径是admin_registrations)
修正后的路由应该是:
devise_for :admins, controllers: { registrations: 'admin_registrations' }
然后修正AdminRegistrationsController的参数:
你的控制器里写的是params.require(:user),但你操作的是Admin模型,注册时提交的参数是:admin而不是:user,这会导致参数不允许或者报错。修改成:
class AdminRegistrationsController < Devise::RegistrationsController private def sign_up_params params.require(:admin).permit(:first_name, :last_name, :username, :hometown, :email, :password, :password_confirmation) end def account_update_params params.require(:admin).permit(:first_name, :last_name, :username, :hometown, :email, :password, :password_confirmation, :current_password) end end
最后检查导航栏链接:
报错提示找不到devise/posts的路由,大概率是导航栏里某个Devise相关的链接写错了scope。比如Admin的注册链接应该用new_admin_registration_path,而不是用户的new_user_registration_path,确保所有Admin的Devise链接都用正确的helper路径。
做完这些修改后,重启Rails服务器,应该就能解决这两个问题了。
内容的提问来源于stack exchange,提问作者ezweizig

