Rails中admin_path需传current_user.id的原因及跳转index的解决方法
报错原因
你当前的路由配置用了Rails默认的resources :admin,这套RESTful路由规则下:
- 指向控制器
index动作的路由辅助方法为复数形式的admins_path,对应路径/admins,无需传参 - 你调用的
admin_path是单数形式,默认指向show动作,对应路径/admins/:id,要求必须传入id参数
你调用admin_path时不传id,Rails就会自动匹配show动作的路由,进而触发缺少必填id参数的报错。
调整方案
推荐优先用以下第一种方案,更符合后台单例资源的使用场景:
方案1:直接指定路由映射(推荐)
修改routes.rb中的配置,删掉原有的resources :admin,替换为如下代码:
get 'admin', to: 'admin#index', as: :admin
修改完成后,admin_path就会直接指向Admin控制器的index动作,无需传任何参数,导航栏代码可以直接改成:
<%= link_to 'Dashboard', admin_path, class: "nav-link" %>
方案2:保留resources配置的修改方式
如果要保留resources写法,需要指定对应控制器避免路由匹配到默认的复数控制器,修改routes.rb如下:
resources :admin, controller: 'admin'
此时导航栏直接调用index动作对应的复数路由辅助方法即可,无需传参:
<%= link_to 'Dashboard', admins_path, class: "nav-link" %>
额外优化建议
你当前Admin控制器的权限校验方法存在冗余代码,且flash提示放在重定向之后会导致提示不生效,可以调整为如下写法:
def authenticate_user_as_admin authenticate_user! unless current_user.admin? flash[:alert] = "抱歉 #{current_user.first_name} #{current_user.last_name},你没有权限访问该页面" redirect_to root_path end end
内容的提问来源于stack exchange,提问作者kbob
相关产品推荐
相关产品推荐

