将 locale 参数附加到 js-routes gem 在 rails 中生成的所有路径

Append locale parameter to all paths generated by js-routes gem in rails

本文关键字:路径 rails 参数 locale gem js-routes      更新时间:2023-09-26

我正在使用js-routes gem (https://github.com/railsware/js-routes)和Rails 4.0.0。

我想做的是在我的 rails 应用程序中由 js-routes 生成的每个路由中包含当前的语言环境字符串。并且此区域设置字符串(例如"en")将从当前请求的查询字符串中提取。(因此,如果用户决定切换区域设置,则页面加载可能会有所不同。

在 application_controller.rb 中,我有以下内容来发送和接收区域设置。这会成功地将 locale 参数附加到 Rails 生成的路由中,但不是由 js-routes 生成的。(在config/routes.rb中未设置任何内容)

application_controller.rb:

before_filter :set_locale
def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end
def default_url_options(options={})
  { locale: I18n.locale }
end

在javascript中,我可以调用Routes.login_path()来获取/login,但我想获得/login?locale=en而不必将语言环境传递给login_path()方法。对于我所有其他路线也是如此。

我的问题是如何让 js-routes 将"locale"参数添加到它生成的所有路由中,例如 /login?locale=fr ,而无需将任何其他选项传递给路由函数。

如果你在某个地方将语言环境设置为全局变量,你可以使用当前版本的js-routes执行以下操作(例如,假设使用i18next)

# config/initializers/js_routes.rb
JsRoutes.setup do |config|
  config.serializer = <<~'JS'
    function(object) {
      object.locale = i18next.language
      return Routes.default_serializer(object)
    }
  JS
end

现在,您的语言环境参数将附加到所有js路由中:

Routes.some_path() //=> /path/to/page?locale=es-ES