如何立即反映URL中区域设置的变化?

时间:2014-05-01 11:16:37

标签: ruby-on-rails ruby ruby-on-rails-4 localization

我的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中,那将会很不错。

如何做到这一点?

2 个答案:

答案 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