Rails-маршруты с областью видимости ": locale" и мелкими вложенными ресурсами - PullRequest
8 голосов
/ 21 июня 2011

Поэтому я хочу, чтобы Rails обрабатывал специфичные для локали маршруты для меня, например,

/en/companies
/nl/companies

Это прекрасно работает с определением маршрутов:

scope "(:locale)", :locale => /en|nl/ do
  resources :companies
end

Но в то же время компанииимеют мелкие вложенные ресурсы, например, так:

scope "(:locale)", :locale => /en|nl/ do
  resources :companies, :shallow => true do
    resources :pages
  end
end

Позволяет использовать пути типа /en/companies/1/pages, но не пути типа /en/pages/1/edit.Так как «мелкий» также удаляет «путь» части пути, кажется, я застрял с /pages/1/edit?locale=en.Нет ли способа заставить Rails обрабатывать мелкие вложенные ресурсы с помощью локалей таким образом, чтобы я мог использовать /en/pages/1/edit?

Ответы [ 2 ]

14 голосов
/ 21 июня 2011

Ах да! Я нашел ответ в документации API . Магия заключается в ключевом слове :shallow_path, и в приведенном выше примере это работает так:

scope :path => "(:locale)", :shallow_path => "(:locale)", :locale => /en|nl/ do
  resources :companies, :shallow => true do
    resources :pages
  end
end

Теперь URL вроде /en/pages/1/edit отлично работает!

3 голосов
/ 17 августа 2011

Большое спасибо, Паскаль, это было очень полезно для меня. Я заметил похожее поведение при настройке моих вложенных ресурсов.

Я бы добавил что-то, возможность использовать оператор блока для мелкого вместо параметра. Прямо сейчас, используя синтаксис, который вы дали, только прямые потомки (: страницы) будут поверхностными.

Если по какой-либо случайности вы захотите вложить на один уровень глубже (давайте пропустим спор о том, является ли это наилучшей практикой или нет), использование мелкого блока приведет к глубине, необходимой для этого:

resources :users do 
  shallow do
    resources :categories do
      resources :sections do
        resources :pages
      end
    end
    resources :news
  end
end

Вот пример доступных помощников по маршрутам для всех ресурсов, вложенных в: users

new_category_section  GET    (/:locale)(/:locale)/categorys/:category_id/sections/new(.:format)     {:locale=>/fr|en/, :action=>"new", :controller=>"sections"}
edit_section          GET    (/:locale)(/:locale)/sections/:id/edit(.:format)                       {:locale=>/fr|en/, :action=>"edit", :controller=>"sections"}
section               GET    (/:locale)(/:locale)/sections/:id(.:format)                            {:locale=>/fr|en/, :action=>"show", :controller=>"sections"}
                      PUT    (/:locale)(/:locale)/sections/:id(.:format)                            {:locale=>/fr|en/, :action=>"update", :controller=>"sections"}
                      DELETE (/:locale)(/:locale)/sections/:id(.:format)                            {:locale=>/fr|en/, :action=>"destroy", :controller=>"sections"}

   section_pages      GET    (/:locale)(/:locale)/sections/:section_id/pages(.:format)              {:locale=>/fr|en/, :action=>"index", :controller=>"pages"}
                      POST   (/:locale)(/:locale)/sections/:section_id/pages(.:format)              {:locale=>/fr|en/, :action=>"create", :controller=>"pages"}
new_section_info_page GET    (/:locale)(/:locale)/sections/:section_id/pages/new(.:format)          {:locale=>/fr|en/, :action=>"new", :controller=>"pages"}
        dit_info_page GET    (/:locale)(/:locale)/pages/:id/edit(.:format)                          {:locale=>/fr|en/, :action=>"edit", :controller=>"pages"}
            info_page GET    (/:locale)(/:locale)/pages/:id(.:format)                               {:locale=>/fr|en/, :action=>"show", :controller=>"pages"}
                      PUT    (/:locale)(/:locale)/pages/:id(.:format)                               {:locale=>/fr|en/, :action=>"update", :controller=>"pages"}
                      DELETE (/:locale)(/:locale)/pages/:id(.:format)                               {:locale=>/fr|en/, :action=>"destroy", :controller=>"pages"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...