Rails 5.0.7提示路由不匹配,但rake routes显示import路由存在,求排查
我来帮你梳理下这个问题!从你给出的路由定义和rake routes输出来看,路由本身的配置是没问题的:import_admin_user POST /admin/users/:id/import(.:format) admin/users#import,这说明这是一个针对单个User实例的member路由,必须传入对应的用户ID才能生成合法路径。你遇到的"No route matches"错误,大概率是调用路由时遗漏了必要的:id参数,或者参数传递方式不对,下面是具体的排查点和解决办法:
1. 视图中调用路由时遗漏ID
如果你在视图里是这么写的:
<%= link_to "执行导入", import_admin_user_path, method: :post %>
或者表单里这么写:
<%= form_for :import, url: import_admin_user_path do |f| %>
这两种写法都没传入目标用户的ID,Rails找不到路由要求的:id参数,自然会报错。
正确的写法需要传入对应的User实例或者ID:
<!-- 传入User实例 --> <%= link_to "执行导入", import_admin_user_path(@user), method: :post %> <!-- 或者直接传入ID参数 --> <%= link_to "执行导入", import_admin_user_path(id: @user.id), method: :post %>
2. 控制器中跳转时遗漏ID
如果是在控制器里用redirect_to或者url_for调用这个路由,比如:
redirect_to import_admin_user_path
同样会触发错误,必须补充用户ID:
redirect_to import_admin_user_path(@user) # 或者直接用当前请求的ID参数 redirect_to import_admin_user_path(id: params[:id])
3. 确认路由命名是否正确
注意你的路由名称是单数的import_admin_user_path(因为是member路由,对应单个用户),如果不小心写成了复数的import_admin_users_path,也会出现找不到路由的情况,这点要仔细检查。
额外建议:如果是批量导入,改用collection路由
如果你的import动作是批量导入用户(而非针对单个用户的操作),那其实应该用collection路由替代member,这样就不需要ID参数了:
namespace :admin do resources :users do collection do post :import end end end
此时rake routes会输出:import_admin_users POST /admin/users/import(.:format) admin/users#import,调用时直接用import_admin_users_path即可,无需传入ID。
你可以根据自己的业务需求选择对应的路由类型~
内容的提问来源于stack exchange,提问作者pguardiario

