18

我正在使用具有以下路由条件的 Rails 3.2 应用程序:

scope "(:locale)", locale: /de|en/ do
  resources :categories, only: [:index, :show]
  get "newest/index", as: :newest
end

我有一个具有以下功能的控制器:

class LocaleController < ApplicationController
  def set
    session[:locale_override] = params[:locale]
    redirect_to params[:return_to]
  end
end

我在模板中将其与类似的东西一起使用:

 = link_to set_locale_path(locale: :de, return_to: current_path(locale: :de)) do
   = image_tag 'de.png', style: 'vertical-align: middle'
     = t('.languages.german')

我想知道为什么 Rails 中不存在诸如 之类的助手current_path,它能够推断出我们当前正在使用的路线,并重新路由到它包括新选项。

我遇到的问题是使用类似的东西redirect_to :back,将用户推回/en/........(或/de/...),这会导致糟糕的体验。

到目前为止,我将语言环境存储在会话中,但这不适用于 Google 和其他索引服务。

我敢肯定,如果我投入了足够的时间,我可以找到一些足够聪明的东西来检测匹配的路线,并换掉语言环境部分,但我觉得这将是一个 hack。

我对所有想法持开放态度,但这个SO question建议只使用sub(); 不幸的是,像语言环境短代码这样短且频繁出现的字符串,可能不太明智。

4

2 回答 2

33

如果您使用:locale范围,您可以使用url_foras current_path

# Given your page is /en/category/newest with :locale set to 'en' by scope

url_for(:locale => :en) # => /en/category/newest
url_for(:locale => :de) # => /de/kategorie/neueste
于 2012-06-14T13:19:45.777 回答
5

如果有人看到这里,你可以使用request.fullpathwhich 应该在域名之后给你所有,因此,将包括语言环境。

于 2014-06-19T10:22:41.267 回答