我正在尝试在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这些例子。
路由文件是否可以尝试执行此操作?这对我来说最有意义。
答案 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