首页 > 解决方案 > 为什么 I18n.locale 和 redirect_back 不起作用?

问题描述

我正在尝试在站点 URL 中创建一个永久固定的语言环境。也就是说,locale 参数应始终位于站点 URL 中。

在 ApplicationController 我添加了以下代码:

def default_url_options
  { locale: I18n.locale }
end

理论上,我现在应该总是在所有 URL 中都有 locale 参数。正确的?但是为什么这没有发生呢?我需要的第一件事是绝对始终在特定命名空间内的 URL 中使用 locale 参数。

接下来我有这个控制器:

class Public::BaseController < ApplicationController
  layout 'public'

  around_action :prepare_locale

  private

  def prepare_locale(&action)
    received_locale = params[:locale].presence || I18n.default_locale

    if I18n.available_locales.include?(received_locale.to_sym)
      I18n.with_locale(received_locale, &action)
    else
      I18n.with_locale(I18n.default_locale, &action)
    end
  end
end

这段代码负责更改语言环境参数:

class Service::LanguagesController < Service::BaseController
  def change
    received_locale = params[:new_locale].presence || I18n.default_locale

    redirect_back(
      fallback_location: root_path,
      allow_other_host: false,
      params: {  # this is to make sure
        locale: received_locale
      },
      locale: received_locale
    )
  end
end

结果,params[:new_locale]有了新的语言环境。但redirect_back不会改变任何东西。为什么?

此代码有效:

redirect_to root_path(locale: received_locale)

但是这个选项不适合,因为它不方便。

总的来说,我不明白我怎么能做我想做的事。

标签: ruby-on-railsruby-on-rails-6

解决方案


我查看了Rails内部结构,发现这redirect_back是第一个参数。看这里redirect_toreferrer

但在这种情况下,params传递给redirect_to被忽略,因为它只是一个String.

我建议您redirect_to改用并明确传递语言环境。


推荐阅读