Tin*_*n81 0 ruby localization ruby-on-rails ruby-on-rails-4
我在我的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
Run Code Online (Sandbox Code Playgroud)
一切正常,但用户切换语言环境时,新的语言环境不会显示在URL中.
例如,当我在页面上/de/faq然后单击English下拉菜单时,页面的内容将切换为英语(我猜会话也会调整为英语),但URL仍然存在/de/faq.只有在此之后的下一次单击才能使URL中的区域设置调整为/en/....
但是,如果区域设置更改将立即反映在URL中,那将是很好的.
如何才能做到这一点?
redirect_to :back不接受任何其他参数,因为它将使用请求标头提供的URL.你应该这样做:
url_hash = Rails.application.routes.recognize_path URI(request.referer).path
url_hash[:locale] = params[:set_locale]
redirect_to url_hash
Run Code Online (Sandbox Code Playgroud)
说明:
Rails.application.routes.recognize_path URI(request.referer).path
Run Code Online (Sandbox Code Playgroud)
此行采用referer url(这是请求来自的URL,并在您调用时使用redirect_to :back).然后用URI解析它以单独提取路径,就像/de/faq.
有路径我们正在使用Rails管道功能recognize_path.此方法使用您的路由将给定路径转换为类似哈希{controller: 'MyController', action: 'my_action', param: 'my_param', ... }.由于您的路由在URL中包含区域设置,因此引用URL中使用的区域设置可以在密钥下的此哈希中访问:locale.
现在第二行只是:locale将此哈希中的值更改为已传递的任何语言环境值.然后,如果您使用此哈希重定向,rails将使用此哈希从其生成URL,除了locale之外,它将与referer URL完全相同.
您很可能仍需要使用会话来存储区域设置.
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |