ruby-on-rails - official - ruby on rails software
Enrutamiento de Rails 3-especificando un controlador exacto desde dentro de un espacio de nombres (4)
Tengo un pequeño problema con los espacios de nombres de rutas que no he encontrado antes. Esto es en realidad parte de un desarrollo de gemas que estoy haciendo, pero he revisado el problema para que se adapte a una situación de rieles más genérica.
Básicamente, tengo una ruta de nombre de nombre, pero quiero que se dirija a un controlador genérico (nivel superior).
Mi controlador es PublishController
, que maneja la publicación de muchos tipos diferentes de modelos, todos los cuales se ajustan a la misma interfaz, pero pueden estar bajo diferentes espacios de nombres. Mis rutas se ven así:
# config/routes.rb
namespace :manage do
resources :projects do
get ''publish'' => ''publish#create''
get ''unpublish'' => ''publish#destroy''
end
end
El problema es que esto crea las siguientes rutas:
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"}
¿Cuál es la ruta que quiero, solo que no se asigna al controlador correcto? He intentado todo lo que se me ocurre intentar y permitir que el controlador no lleve el espacio de nombres, pero estoy perplejo.
Sé que podría hacer lo siguiente:
get ''manage/features/:feature_id/publish'' => "publish#create", :as => "manage_project_publish"
que produce:
manage_project_publish GET /manage/projects/:project_id/publish(.:format) {:controller=>"publish", :action=>"create"}
pero idealmente, preferiría usar la declaración anidada (para facilitar la lectura), si es posible; que estoy empezando a pensar que no lo es.
Creo que lo que quieres es esto:
namespace :manage, module: nil do
resources :projects do
get ''publish'' => ''publish#create''
get ''unpublish'' => ''publish#destroy''
end
end
Esto crea las rutas nombradas como desee (manage_projects ...) pero aún así llama al controlador ::Publish
Si te entiendo bien, quieres esto:
scope :manage do
resources :projects, :only => [] do
get ''publish'' => ''publish#create''
get ''unpublish'' => ''publish#destroy''
end
end
Para realizar estas rutas:
project_publish GET /projects/:project_id/publish(.:format) {:action=>"create", :controller=>"publish"}
project_unpublish GET /projects/:project_id/unpublish(.:format) {:action=>"destroy", :controller=>"publish"}
¿Estoy entendiendo tu necesidad correctamente? Si es así, esto es lo que Ryan está explicando.
Use el scope
lugar del namespace
de namespace
cuando desee una ruta con alcance pero no un controlador dentro de un módulo del mismo nombre.
recurso toma un hash opcional donde puede especificar el controlador para
resource :projects do
sería escrito como
resource :projects, :controller=>:publish do