我正在尝试为移动API设置路由,该API应具有版本化的api路径。我已经可以使移动Auth工作,它在位于 / controllers / api / v1 / mobile / 的单独的Controller AuthController 中实现。
用法示例:
myapp.com/api/v1/mobile/auth
但是现在我想将我现有的ressources-Controllers注册到这个路径模式作为额外的api-routes。具体:这将是位于 /controllers/tracker/tasks_controller.rb 的 TasksController 。所以我在路由定义中添加了移动路由:
# routes.rb
namespace :tracker, path: 'timetracking' do
resources :tasks, 'jobs'
end
namespace :api do
namespace :v1 do
namespace :mobile do
resources :auth, :only => [:create, :destroy]
namespace :tracker do #added mobile route
resource :tasks, controller: 'tracker/tasks', as: :mobile_tasks
end
end
end
end
但是当我致电 myapp.com/api/v1/mobile/tracker/tasks 时会出现错误信息:
Routing Error
uninitialized constant Api::V1::Mobile::Tracker
我特别在此路线中添加了别名:mobile_tasks ,以避免与上述原始任务路线发生任何冲突。有什么想法,如何为这条路线正确设置控制器?
更新#1
将此路由定义为范围而不是命名空间,也不起作用。
scope "/api/v1/mobile/tracker" do
resources :tasks, controller: 'tracker/tasks', as: :mobile_tasks
end
但这一次,它甚至没有解决路径路径本身。
Routing Error
No route matches [GET] "/api/v1/mobile/tracker/tasks"
我认为这可能是一个问题,我的附加mobile-api路由试图指向一个完全不同的命名空间 tracker 。
答案 0 :(得分:20)
根据http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing,您应该使用范围而不是命名空间。
如果您想将/admin/posts
路由到PostsController
(不包含Admin:: module prefix
),您可以使用:
scope "/admin" do
resources :posts, :comments
end
答案 1 :(得分:1)
迟到的答案,但仍然可能会有所帮助:
scope '/v1' do
resources :articles, module: 'v1'
end
控制器
# app/controller/v1/articles_controller.rb
class V1::ArticlesController < ApplicationController
end
现在您应该可以访问此网址:
答案 2 :(得分:1)
添加此答案以明确命名空间&amp;范围。
使用命名空间时,它将为指定资源的URL路径添加前缀,并尝试在名称与命名空间相同的模块下找到控制器。
# config/routes.rb
namespace :admin do
resources :posts, only: [:index]
end
# rake routes
Prefix Verb URI Pattern Controller#Action
admin_posts GET /admin/posts(.:format) admin/posts#index
当我们添加范围时,它只会映射给定范围模式的控制器操作。无需在任何模块下定义控制器。
# config/routes.rb
scope :admin do
resources :posts, only: [:index]
end
# rake routes
Prefix Verb URI Pattern Controller#Action
admin_posts GET /admin/posts(.:format) posts#index
请注意,控制器只是发布没有任何模块名称空间的控制器。
如果我们向范围添加path
选项,它将映射到控制器,其路径选项指定如下
# config/routes.rb
scope module: 'admin', path: 'admin' do
resources :posts, only: [:index]
end
# rake routes
Prefix Verb URI Pattern Controller#Action
admin_posts GET /admin/posts(.:format) admin/posts#index
请注意,控制器现在位于管理模块下。
现在,如果我们想要更改路径方法的名称以识别资源,我们可以在范围中添加as
选项。
# config/routes.rb
namespace module: 'admin', path: 'admin', as: 'root' do
resources :posts, only: [:index]
end
# rake routes
Prefix Verb URI Pattern Controller#Action
root_posts GET /admin/posts(.:format) admin/posts#index
您可以在前缀动词中看到更改。
希望它可以帮助他人。