14

我正在尝试为移动 API 设置路由,它应该有一个版本化的 api-path。我已经可以让移动 Auth 工作了,它在/controllers/api/v1/mobile/中的一个单独的控制器AuthController中实现。

使用示例:

myapp.com/api/v1/mobile/auth

但是现在我想将我现有的资源控制器注册到这个路径模式作为额外的 api 路由。具体:这将是位于/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 路由试图指向一个完全不同的 namespace tracker

4

3 回答 3

23

根据http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing你应该使用范围而不是命名空间。

如果你想路由/admin/postsPostsController(没有Admin:: module prefix),你可以使用:

scope "/admin" do
  resources :posts, :comments
end
于 2012-04-23T19:30:07.887 回答
2

添加此答案以明确命名空间和范围。

使用命名空间时,它会在指定资源的 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

您可以看到前缀动词的变化。

希望它可以帮助别人。

于 2018-03-07T10:37:54.217 回答
1

迟到的答案,但仍然可能会有所帮助:

scope '/v1' do  
  resources :articles, module: 'v1'
end

控制器

# app/controller/v1/articles_controller.rb
class V1::ArticlesController < ApplicationController

end

现在您应该可以访问此网址:

http://localhost:3000/v1/articles

于 2015-10-23T11:33:22.837 回答