我正在尝试在网站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)
但是此选项不合适,因为它不方便。
总的来说,我不明白我该怎么做。
答案 0 :(得分:-1)
我查看了Rails的内部结构,发现redirect_back
是一个redirect_to
,其中传递了referrer
作为第一个参数。 See here
但是在那种情况下,传递给params
的{{1}}会被忽略,因为它只是redirect_to
。
我建议您改用String
并显式传递语言环境。