Ответ 1
ресурс принимает необязательный хэш, где вы можете указать контроллер, чтобы
resource :projects do
будет записываться как
resource :projects, :controller=>:publish do
У меня немного проблема с пространствами маршрутов, с которыми я раньше не сталкивался. На самом деле это часть разработки драгоценных камней, которую я делаю, но я переработал эту проблему, чтобы соответствовать более общей ситуации с рельсами.
В принципе, у меня есть путь, основанный на именах, но я хочу, чтобы он направлялся на общий (верхний уровень) контроллер.
Мой контроллер 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"}
но в идеале я бы предпочел использовать вложенную декларацию (для удобочитаемости) - если это возможно; который я начинаю думать, что это не так.
ресурс принимает необязательный хэш, где вы можете указать контроллер, чтобы
resource :projects do
будет записываться как
resource :projects, :controller=>:publish do
Используйте scope
, а не namespace
, если вы хотите использовать ограниченный маршрут, но не контроллер в модуле с таким же именем.
Если вы правильно поняли, вы хотите:
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"}
Я правильно понимаю вашу потребность? Если это так, это объясняет Райан.
Я думаю, что вы хотите:
namespace :manage, module: nil do
resources :projects do
get 'publish' => 'publish#create'
get 'unpublish' => 'publish#destroy'
end
end
Это создает именованные маршруты по вашему желанию (manage_projects...), но все же вызывает контроллер ::Publish