Модель Ruby on rails и контроллеры внутри разных пространств имен - PullRequest
1 голос
/ 24 мая 2009

OK. Это безумие.

Я новичок в RoR и очень хочу в него разобраться, потому что все, что я видел до сих пор, делает его более привлекательным для той работы, которую я выполняю.

Однако я не могу выполнить очень простую вещь с RoR.

Я хочу эти контроллеры:

/admin/blog/entries (index/show/edit/delete)
/admin/blog/categories (index/show/edit/delete)
/admin/blog/comments (index/show/edit/delete)
... and so on

А эти модели:

Blog::Entry    (table: blog_entries)
Blog::Category (table: blog_categories)
Blog::Comments (table: blog_comments)
... and so on

Теперь я уже прошел через некоторое количество страданий, чтобы сделать эту работу. Моя первая попытка была с генерацией строительных лесов (я использую 2.2.2). Я сгенерировал свои строительные леса, но мне пришлось переместить мою модель, а затем исправить ссылки на модель в моем контроллере (см. Модель Ruby on Rails внутри пространства имен не может быть найдена в контроллере ).

Это уже большая боль, но эй, я заставил ее работать. Теперь, хотя form_for не будет работать, и я не могу понять, как использовать помощники URL (я понятия не имею, как они называются ... это автоматически генерируемые методы, которые возвращают URL-адреса контроллерам, связанным с моделью). Я не могу понять, как их зовут. Моя модель - Блог :: Записи. Я попытался возиться с методом ресурса карты route.rb, но не повезло. Когда я пытаюсь использовать form_for с моей моделью, я получаю эту ошибку

undefined method `blog_entries_path' for #<ActionView::Base:0xb6848080>

Теперь. Это действительно довольно сложно. Я не собираюсь полностью разрушать организацию моего кода, чтобы использовать эту платформу, и если я не могу понять, как выполнить эту простую задачу (я исследовал это по крайней мере 5 часов), то я просто не могу продолжать.

Есть какие-нибудь идеи о том, как этого добиться?

Спасибо

EDIT

Вот мои маршруты:

             admin_blog_entries GET    /admin_blog_entries                  {:controller=>"admin_blog_entries", :action=>"index"}
   formatted_admin_blog_entries GET    /admin_blog_entries.:format          {:controller=>"admin_blog_entries", :action=>"index"}
                                POST   /admin_blog_entries                  {:controller=>"admin_blog_entries", :action=>"create"}
                                POST   /admin_blog_entries.:format          {:controller=>"admin_blog_entries", :action=>"create"}
           new_admin_blog_entry GET    /admin_blog_entries/new              {:controller=>"admin_blog_entries", :action=>"new"}
 formatted_new_admin_blog_entry GET    /admin_blog_entries/new.:format      {:controller=>"admin_blog_entries", :action=>"new"}
          edit_admin_blog_entry GET    /admin_blog_entries/:id/edit         {:controller=>"admin_blog_entries", :action=>"edit"}
formatted_edit_admin_blog_entry GET    /admin_blog_entries/:id/edit.:format {:controller=>"admin_blog_entries", :action=>"edit"}
               admin_blog_entry GET    /admin_blog_entries/:id              {:controller=>"admin_blog_entries", :action=>"show"}
     formatted_admin_blog_entry GET    /admin_blog_entries/:id.:format      {:controller=>"admin_blog_entries", :action=>"show"}
                                PUT    /admin_blog_entries/:id              {:controller=>"admin_blog_entries", :action=>"update"}
                                PUT    /admin_blog_entries/:id.:format      {:controller=>"admin_blog_entries", :action=>"update"}
                                DELETE /admin_blog_entries/:id              {:controller=>"admin_blog_entries", :action=>"destroy"}
                                DELETE /admin_blog_entries/:id.:format      {:controller=>"admin_blog_entries", :action=>"destroy"}
                           home        /                                    {:action=>"index", :controller=>"index"}
                                       /:controller/:action/:id
                                       /:controller/:action/:id.:format

Это выглядит не так. Вот мой route.rb (комментарии удалены):

ActionController::Routing::Routes.draw do |map|

  map.resources :admin_blog_entries

  map.home '', :controller => 'index'

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

Ответы [ 3 ]

2 голосов
/ 25 мая 2009

Вы пробовали посмотреть список маршрутов, который вам дают "маршруты рейка"? если ваш route.rb правильный, он должен показать вам правильное имя для маршрута записей в блоге.

также, может быть, это может помочь: http://www.coreywoodcox.com/2008/08/18/rails-namespaces-subdomains/.

редактирование:

хорошо, тогда правильный путь для вызова маршрута - admin_blog_entries_path вместо blog_entries_path.

1 голос
/ 29 апреля 2010

Хорошо, вот мой довольно хакерский способ сделать это, что мне не нравится, но работает.

В моем случае у меня есть модели Blog :: Article, Blog :: Comment, они вложены в маршруты. Одно предупреждение при использовании этого подхода - в Blog :: CommentsController при загрузке статьи вы можете ожидать params [: article_id] или params [: blog_article_id]. Отнюдь не приятно, но, как я уже сказал. Это работает: /

blog.resources :articles do |article|
  article.resources :comments
end

blog.resources :blog_articles, :controller => 'articles' do |blog_article|
  blog_article.resources :blog_comments, :controller => 'comments'
end
1 голос
/ 27 мая 2009

Ваш route.rb должен выглядеть так:

map.namespace :admin do |admin|
  admin.namespace :blog do |blog|
    blog.resources :entries
    blog.resources :categories
    ...
  end
end

но я не уверен, как обработать эту часть '/ blog /' в вашем URL (я еще не использовал пространство имен в своих моделях) Но с этими маршрутами вы сможете использовать:

admin_blog_categories_path               => '/admin/blog/categiries'
admin_blog_category_path(@some_category) => '/admin/blog/categories/1'

и т. Д.

...