本地化后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后就支持)。
验证步骤
- 打开
config/routes.rb,确认password_resets路由是否在locale作用域内 - 尝试上述任意一种方案后,重新触发密码重置邮件,检查链接是否正常生成并可访问
内容的提问来源于stack exchange,提问作者Motash
相关产品推荐
相关产品推荐

