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

本地化后Rails应用密码重置链接无法正常工作

解决多语言本地化后密码重置链接生成报错的问题

你遇到的应该是ActionController::UrlGenerationError(路由生成错误),这几乎肯定是启用多语言时给路由添加了locale作用域,但生成重置链接时没有传入locale参数导致的。

问题根源

当你在config/routes.rb中添加了类似这样的本地化路由配置时:

scope "(:locale)", locale: /en|zh-CN/ do
  resources :password_resets, only: [:new, :create, :edit, :update]
  # 其他路由...
end

Rails的路由系统会要求生成该作用域下的URL时必须提供locale参数,否则找不到对应的路由匹配规则,就会抛出路由生成错误。

具体解决方案

方案1:生成链接时显式传入locale参数

直接在调用edit_password_reset_url时加上当前的locale值:

edit_password_reset_url(@user.reset_token, email: @user.email, locale: I18n.locale)

这样生成的链接会自动带上当前语言的路径前缀(比如/zh-CN/password_resets/xxx/edit?email=...),符合多语言的需求。

方案2:给路由作用域设置默认locale

如果希望用户未指定语言时使用默认locale(比如英文),可以修改路由配置,添加defaults选项:

scope "(:locale)", locale: /en|zh-CN/, defaults: { locale: "en" } do
  resources :password_resets, only: [:new, :create, :edit, :update]
  # 其他路由...
end

这样即使生成链接时不传locale参数,Rails也会自动使用默认值,不会报错,同时支持用户通过URL前缀切换语言。

方案3:让重置链接使用默认语言(不带locale前缀)

如果你希望密码重置邮件里的链接始终使用默认语言(不随用户当前语言变化),可以直接指定locale: nil:

edit_password_reset_url(@user.reset_token, email: @user.email, locale: nil)

不过这个方案需要确保你的路由配置允许不带locale的访问(通常设置了默认locale后就支持)。

验证步骤

  1. 打开config/routes.rb,确认password_resets路由是否在locale作用域内
  2. 尝试上述任意一种方案后,重新触发密码重置邮件,检查链接是否正常生成并可访问

内容的提问来源于stack exchange,提问作者Motash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:34:50