2017-02-05 6 views
1

The Rails Documentation говорит:рельсов опциональный путь рамка с перенаправлением

# config/routes.rb 
scope "(:locale)", locale: /en|nl/ do 
    resources :books 
end 

При таком подходе вы не получите Routing Error при получении доступа к ресурсам, таким как http://localhost:3001/books без языка. Это полезно, если вы хотите использовать локаль по умолчанию, если он не указан.

Я хотел бы некорректных/отсутствующих локали быть перенаправлены ... не ошибка маршрутизации!

Например посещение localhost:3000/asdf/books должен перенаправлять localhost:3000/en/books

ПОЧЕМУ?, потому что я унаследовал приложение без каких-либо ограничений, и аналитика google показывает кучу посещения кучи случайных/недействительных локалей. Я бы предпочел, чтобы ссылки работали как есть для улучшения интернета и перенаправления их на правильный URL. Лучший пользовательский опыт, чем показание 404.

ответ

2

Перенаправление некорректные локали, добавьте следующий за рамки:

get '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}") 

Для redirect пропавших без вести мест, изменить свою область деятельности:

не
scope '(:locale)', locale: /en|nl/ do 

к:

scope ':locale', locale: /en|nl/ do 

Таким образом локаль уже не факультативным. Наконец, перенаправлять пути, которые отсутствуют региональные настройки:

get '/*path', to: redirect("/#{I18n.default_locale}/%{path}"), 
    constraints: lambda { |req| I18n.available_locales.none? { |locale| req.path.starts_with? locale.to_s } } 

Конечный результат:

scope ':locale', locale: /#{I18n.available_locales.join("|")}/ do 
    resources :books 
end 

get '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}") 
get '/*path', to: redirect("/#{I18n.default_locale}/%{path}"), 
    constraints: lambda { |req| I18n.available_locales.none? { |locale| req.path.starts_with? locale.to_s } } 
1

Вы можете просто поймать его в контроллере приложений. В маршрутах:

scope "/:locale" do 
    resources :books 
end 

Затем в приложение/контроллеры/application_controller.rb:

before_action :set_locale 
def set_locale 
    unless I18n.available_locales.map(&:to_s).include?(params[:locale]) 
    redirect_to foo_url(locale: :en) 
    end 
end