Как улучшить работу роутера с пространствами имен, имеющими то же имя, что и ресурс - PullRequest
2 голосов
/ 04 июля 2011

Я использую Ruby on Rails 3.0.7 и пытаюсь правильно настроить (и, насколько это возможно,) мой маршрутизатор.

В файле routes.rb у меня есть:

namespace :articles do 
  resources :categories 
end

resources :articles

Чтобы работать должным образом, я должен указать namespace перед оператором resources :articles, чтобы маршрутизатор перехватывал запросы и направлял их в пространство имен, связанное со статьями. В противном случае (если resources :articles указано перед namespace), как можно вычесть из приведенного выше кода, все запросы, такие как

<my_site>/articles/1
<my_site>/articles/new
<my_site>/articles/1/edit
...

перехватывается, так что пространство имен статей будет "едва" достигнуто. Например, если вы сделаете запрос наподобие <my_site>/articles/categories, он выдаст ошибку в следующем виде:

ActiveRecord::RecordNotFound
Couldn't find Article with ID=categories

Итак, как я могу справиться с этой ситуацией и как я могу улучшить код маршрутизатора? О чем вы советуетесь?


Запустив команду rake routes в моей консоли, я получаю это (как указано):

articles_categories GET   /articles/categories(.:format)                                                        
{:action=>"index", :controller=>"articles/categories"}

POST   /articles/categories(.:format)
{:action=>"create", :controller=>"articles/categories"}

new_articles_category GET    /articles/categories/new(.:format)                                                   
{:action=>"new", :controller=>"articles/categories"}

edit_articles_category GET    /articles/categories/:id/edit(.:format)                                              
{:action=>"edit", :controller=>"articles/categories"}

articles_category GET    /articles/categories/:id(.:format)                                                   
{:action=>"show", :controller=>"articles/categories"}

PUT    /articles/categories/:id(.:format)                                                    
{:action=>"update", :controller=>"articles/categories"}

DELETE /articles/categories/:id(.:format)                                                   
{:action=>"destroy", :controller=>"articles/categories"}

articles GET    /articles(.:format)                                                                   
{:action=>"index", :controller=>"articles"}

POST   /articles(.:format)                                                                  
{:action=>"create", :controller=>"articles"}

new_article GET    /articles/new(.:format)                                                              
{:action=>"new", :controller=>"articles"}

edit_article GET    /articles/:id/edit(.:format)                                                         
{:action=>"edit", :controller=>"articles"}

article GET    /articles/:id(.:format)                                                               
{:action=>"show", :controller=>"articles"}

PUT    /articles/:id(.:format)                                                               
{:action=>"update", :controller=>"articles"}

DELETE /articles/:id(.:format)                                                               
{:action=>"destroy", :controller=>"articles"}

1 Ответ

0 голосов
/ 04 июля 2011

Проверьте эту документацию по rails о пространствах имен контроллера. В нем говорится, что вам нужно присвоить пространство имен вашему контроллеру категорий, например Articles::CategoriesController, и вы должны поместить свой контроллер категорий в каталог app/controllers/articles.

...