我的Rails 4应用程序中有这个区域设置切换器:
class LocalesController < ApplicationController
def change_locale
if params[:set_locale]
session[:locale] = params[:set_locale]
redirect_to(:back, :locale => params[:set_locale])
end
end
end
除了用户切换语言环境时URL中未显示新语言环境外,一切正常。
例如,当我在页面/de/faq
上,然后点击下拉菜单中的English
时,页面内容会切换为英语(我猜会话也会调整为英语),但网址仍为/de/faq
。只有下一次点击后,网址中的区域设置才会调整为/en/...
。
如果区域设置更改会立即反映在URL中,那将会很不错。
如何做到这一点?
答案 0 :(得分:5)
redirect_to :back
不接受任何其他参数,因为它将使用请求标头提供的网址。你应该这样做:
url_hash = Rails.application.routes.recognize_path URI(request.referer).path
url_hash[:locale] = params[:set_locale]
redirect_to url_hash
说明:
Rails.application.routes.recognize_path URI(request.referer).path
此行采用referer url(这是请求来自的url,当你调用redirect_to :back
时使用它)。然后使用URI解析它以单独提取路径,如/de/faq
。
拥有我们使用Rails管道功能recognize_path
的路径。此方法使用您的路由将给定路径转换为类似{controller: 'MyController', action: 'my_action', param: 'my_param', ... }
的哈希值。由于您的路由在网址中包含区域设置,因此引用网址中使用的区域设置可以在:locale
密钥下的此哈希中访问。
现在第二行只是将此哈希中:locale
的值更改为已传递的区域设置值。然后,如果你使用这个哈希重定向,rails将使用这个哈希从它生成URL,除了locale之外,它将与referer URL完全相同。
您很可能仍需要使用会话来存储区域设置。
答案 1 :(得分:1)
您还可以创建帮助程序并添加uri.query
以保留参数:
def redirect_back_with_locale(locale)
uri = URI(request.referer)
url_hash = Rails.application.routes.recognize_path(uri.path)
url_hash[:locale] = locale
redirect_to [url_for(url_hash), uri.query].compact.join('?')
end