为什么I18n.locale和redirect_back不起作用?

时间:2019-12-18 13:21:13

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

我正在尝试在网站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)

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

总的来说,我不明白我该怎么做。

1 个答案:

答案 0 :(得分:-1)

我查看了Rails的内部结构,发现redirect_back是一个redirect_to,其中传递了referrer作为第一个参数。 See here

但是在那种情况下,传递给params的{​​{1}}会被忽略,因为它只是redirect_to

我建议您改用String并显式传递语言环境。