如何修复Rails i18n中的“No Route Matches”路由匹配错误
Rails i18n路由修改后测试报错的修复方案
问题分析
从错误信息能看出,路由生成时把@user对象错误赋值给了:locale参数,导致缺少必填的:id参数。核心原因有两点:
- 测试环境未继承
ApplicationController中设置的default_url_options,路由助手无法自动携带locale参数 - 路由规则里的locale正则表达式存在空格,导致匹配异常
修复步骤
1. 修正路由规则中的正则表达式
打开config/routes.rb,去掉locale正则里的空格,并删除冗余路由:
Rails.application.routes.draw do # 修正正则表达式:移除空格,确保locale匹配正确 scope "(:locale)", locale: /en|ja/ do root 'static_pages#home' # 删除这条冗余路由——scope已经处理了locale前缀,避免路由冲突 # get '/:locale' => 'static_pages#home' # 其余路由保留不变 get '/help', to: 'static_pages#help' get '/about', to: 'static_pages#about' get '/contact', to: 'static_pages#contact' get '/search', to: 'movies#search' get '/show', to: 'movies#show' get '/signup', to: 'users#new' post '/signup', to: 'users#create' post '/guest_login', to: 'guest_sessions#create' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get :following, :followers end end resources :movies resources :account_activations, only: [:edit] resources :resend_activations, only: [:new, :create] resources :password_resets, only: [:new, :create, :edit, :update] resources :comments do resource :comments, only: [:create, :new, :edit, :update, :destroy] resource :favorites, only: [:create, :destroy] end resources :relationships, only: [:create, :destroy] end end
2. 让测试继承默认URL参数设置
打开test/test_helper.rb,在ActionDispatch::IntegrationTest类中添加default_url_options方法,确保测试中的路由助手自动携带locale参数:
class ActionDispatch::IntegrationTest def default_url_options { locale: I18n.locale } end end
3. (可选)单个测试方法临时修复
如果不想修改全局测试配置,也可以在报错的测试方法中明确传递locale参数:
test "should redirect edit when not logged in" do # 明确指定locale参数,避免路由助手参数错乱 get edit_user_path(@user, locale: I18n.default_locale) assert_not flash.empty? assert_redirected_to login_url end
验证修复
运行对应测试命令确认错误消失:
rails test test/controllers/users_controller_test.rb:21
内容的提问来源于stack exchange,提问作者jack20xx
相关产品推荐
相关产品推荐

