我正在使用Rocket_Pants gem为我现有的Rails应用程序提供API访问。我有两个具有相同名称但存储在不同位置的控制器:
我在app/controllers
中存储处理HTTP请求的控制器,以及在API
的子目录app/controllers
中存储处理API调用的控制器。
我的路线中有以下内容:
# HTTP routing
resources :posts do
collection do
get 'search'
end
end
# API routing
api :version => 1 do
resources :posts, :only => [:index, :show]
resources :posts do
collection do
get 'search'
end
end
end
然而,当我rake routes
时,我得到了:
GET /:version/posts/search(.:format) posts#search {:version=>/(1)/, :format=>"json"}
GET /:version/posts(.:format) posts#index {:version=>/(1)/, :format=>"json"}
GET /:version/posts/:id(.:format) posts#show {:version=>/(1)/, :format=>"json"}
这意味着我的API路由实际上指向http控制器而不是API控制器。如何将我的API路线指向API/posts#search
呢?
答案 0 :(得分:1)
鉴于这是您今晚关于Rails路由基础知识的第二个问题,我强烈建议您阅读有关该主题的 Rails Guide 。
对于此问题,您正在寻找scope
。这在 the guide above 中进行了解释。
api version: 1 do
scope module: "api" do
resources :posts, only: [:index, :show] do
collection do
get 'search'
end
end
end
end
另外
app/controllers/api
,而不是app/controllers/API
app/controllers/api/posts_controller.rb
,类名称为class Api::PostsController < ApplicationController
我还应该提一下,我不知道或使用rocket_pants
,但他们的自述文件也为模块中的不同版本建议了命名控制控制器(上面的另一个范围)。
答案 1 :(得分:-1)
更好的“裤子摇滚”答案。
的routes.rb
api :version => 1, module: "api" do
resources :foobars
文件夹结构
-controllers
-api
foobars_controller.rb
etc
api_controller.rb
class ApiController < RocketPants::Base
foobars_controller.rb
class Api::EventsController < ApiController
version 1
etc