Rails 3.1路由:如何在缺少时将语言环境添加到URI的开头?

时间:2011-10-05 21:24:34

标签: ruby-on-rails regex redirect routes locale

我正在尝试在Rails 3.1应用程序中的请求URI的开头插入一个语言环境(如果它丢失)。我创建了一个执行我想要的Ruby脚本:

uri = "/products"
re  = /\A\/((?:[a-z]{2,2})(?:[-|_](?:[A-Z]{2,2}))?)(\/.*)\Z/

unless uri =~ re
  uri = "/en#{uri}"
end

puts uri

因此,如果请求URI为/en-GB/products(区域设置已存在),则它不会执行任何操作。如果是/products(如上例所示),它会吐出/en/products

现在我正试图让它在我的路线文件中工作。这就是我的尝试:

match "(*all)", :to => redirect do |params, request|
  uri = request.path_info
  re  = /\A\/((?:[a-z]{2,2})(?:[-|_](?:[A-Z]{2,2}))?)(\/.*)\Z/

  unless uri =~ re
    uri = "/en#{uri}"
  end

  "#{request.scheme}://#{request.host_with_port}#{uri}"
end

我的问题是我甚至无法进入比赛区。我一直在ArgumentError: redirection argument not supported

我尝试将其更改为match "(*all)" => redirect do |params, request|无效。

我正在查看Rails 3.1 API documentation这些例子。

路由文件是否可以尝试执行此操作?这对我来说最有意义。

3 个答案:

答案 0 :(得分:1)

在路线中引入逻辑气味给我。控制器就是为了这个,我会在路由器中使用可选范围,在控制器中使用before_filter,使用redirect_to

routes.rb - 保持简单:

scope '(:locale)', :constraints => {:locale=> /[a-z]{2}(-[A-Z]{2})?/ } do
  match 'url1' ...
  match 'other' ...
end

控制器:

before_filter :check_locale

protected

def check_locale
  redirect_to "/en#{request.path_info}" if params[:locale].blank?
end

(以上是从记忆中写的)

答案 1 :(得分:0)

我在ActionController的before_filter中找到这些行非常有用。 这些行提取重定向的区域设置,例如foo.com/fie到foo.com/en/fie(或wahtever locale当前的语言环境)。如果用户有一个不受支持的语言环境,他会得到一个提示,他可以用英语...

def set_locale
  params_locale = params[:locale]
  if params_locale
    if (!Supportedlocale::SUPPORTED.include?(params_locale))
      redirect_to "/en/localenotsupported/"
    end
  end
  language_locale = locale_from_accept_language
  default_locale = I18n.default_locale
  I18n.locale = params_locale || language_locale || default_locale

  if params_locale.blank?
    redirect_to "/#{I18n.locale}#{request.path_info}"
  end
end


def locale_from_accept_language
  accepted_lang = request.env['HTTP_ACCEPT_LANGUAGE']
  if (!accepted_lang.nil?)
    accepted_lang.scan(/^[a-z]{2}/).first
  else
    "en" #en is default!
  end
end

答案 2 :(得分:0)

为了保持像分页这样的参数,请执行以下操作:

def check_locale
  if params[:locale].blank?
    I18n.locale = :en 
    redirect_to params.merge!(:locale => I18n.locale)
  end
end

所以

/controler/action?page=10&search=dada => /en/controler/action?page=10&search=dada