Подтвердить что ты не робот

Rails 3 Routing - указание точного контроллера из пространства имен

У меня немного проблема с пространствами маршрутов, с которыми я раньше не сталкивался. На самом деле это часть разработки драгоценных камней, которую я делаю, но я переработал эту проблему, чтобы соответствовать более общей ситуации с рельсами.

В принципе, у меня есть путь, основанный на именах, но я хочу, чтобы он направлялся на общий (верхний уровень) контроллер.

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

# config/routes.rb

namespace :manage do
  resources :projects do
    get 'publish' => 'publish#create'
    get 'unpublish' => 'publish#destroy'
  end
end

Проблема заключается в том, что это создает следующие маршруты:

manage_project_publish GET    /manage/projects/:project_id/publish(.:format)        {:controller=>"manage/publish", :action=>"create"}
manage_project_unpublish GET    /manage/projects/:project_id/unpublish(.:format)      {:controller=>"manage/publish", :action=>"destroy"}

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

Я знаю, что могу сделать следующее:

get 'manage/features/:feature_id/publish' => "publish#create", :as => "manage_project_publish"

который производит:

manage_project_publish GET    /manage/projects/:project_id/publish(.:format)        {:controller=>"publish", :action=>"create"}

но в идеале я бы предпочел использовать вложенную декларацию (для удобочитаемости) - если это возможно; который я начинаю думать, что это не так.

4b9b3361

Ответ 1

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

resource :projects do

будет записываться как

resource :projects, :controller=>:publish do 

Ответ 2

Используйте scope, а не namespace, если вы хотите использовать ограниченный маршрут, но не контроллер в модуле с таким же именем.

Ответ 3

Если вы правильно поняли, вы хотите:

scope :manage do
  resources :projects, :only => [] do
    get 'publish' => 'publish#create'
    get 'unpublish' => 'publish#destroy'
  end
end

чтобы поднять эти маршруты:

project_publish     GET    /projects/:project_id/publish(.:format)    {:action=>"create", :controller=>"publish"}
project_unpublish   GET    /projects/:project_id/unpublish(.:format)  {:action=>"destroy", :controller=>"publish"}

Я правильно понимаю вашу потребность? Если это так, это объясняет Райан.

Ответ 4

Я думаю, что вы хотите:

namespace :manage, module: nil do
  resources :projects do
    get 'publish' => 'publish#create'
    get 'unpublish' => 'publish#destroy'
  end
end

Это создает именованные маршруты по вашему желанию (manage_projects...), но все же вызывает контроллер ::Publish