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

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中,那将是很好的.

如何才能做到这一点?

Bro*_*tse 5

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完全相同.

您很可能仍需要使用会话来存储区域设置.