You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:35:28