Rails 3.1 Маршруты: Как добавить локаль в начало URI при отсутствии? - PullRequest
2 голосов
/ 06 октября 2011

Я пытаюсь вставить локаль в начале URI запроса в приложении Rails 3.1, если оно отсутствует.Я создал скрипт 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 для этих примеров.

Является ли файл маршрутов местом, где можно попробовать это сделать?Для меня это имеет смысл.

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Введение логики в маршруты пахнет для меня. Контроллеры предназначены для этого, и я бы использовал необязательную область видимости в маршрутах и ​​before_filter в контроллере с redirect_to

rout.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

(выше написано по памяти)

0 голосов
/ 31 марта 2012

Чтобы сохранить параметр типа нумерации страниц, сделайте что-то вроде:

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
0 голосов
/ 14 марта 2012

Я нахожу эти строки в before_filter в ActionController весьма полезными. Эти строки извлекают локаль перенаправления, например, foo.com/fie to foo.com/en/fie (или, какой бы ни была текущая локаль). Если у пользователя есть неподдерживаемая локаль, он получает подсказку, что он может продолжить с английским ...

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
...