ruby-on-rails - 为什么 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)
但是这个选项不适合,因为它不方便。
总的来说,我不明白我怎么能做我想做的事。
解决方案
我查看了Rails内部结构,发现这redirect_back
是第一个参数。看这里redirect_to
referrer
但在这种情况下,params
传递给redirect_to
被忽略,因为它只是一个String
.
我建议您redirect_to
改用并明确传递语言环境。
推荐阅读
- spring - Spring Boot,Spring MVC webjars 依赖返回 404
- node.js - 打字稿 - 无法扩充模块
- service - Sitecore 9 安装错误无法启动“Sitecore XConnect 搜索索引器”
- vbscript - 重命名文件时需要 VBScript 对象错误
- arrays - 直到 n = x 的所有排列
- powershell - Powershell try-catch ...其他?
- r - 在 mutate 右侧的重新编码中使用基于 tidyeval 的非标准评估
- sphinx - Sphinx Search / Thinking Sphinx 相关模型的摘录
- r - 将 map_int 与 length() / forms() 组合使用
- python-3.x - 无法从 Anaconda 提示符启动 jupyter notebook