0

我正在使用 Rocket_Pants gem 为我现有的 Rails 应用程序提供 API 访问。我有两个同名但存储在不同位置的控制器:

我将处理 HTTP 请求的控制器存储在 中app/controllers,将处理 API 调用的控制器存储在 的子目录APIapp/controllers

我的路线中有以下内容:

  # 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呢?

4

2 回答 2

1

鉴于这是您今晚关于 Rails 路由基础的第二个问题,我强烈建议您阅读有关该主题的Rails 指南。

对于这个问题,您正在寻找一个scope. 这在上面的指南中有解释。

api version: 1 do
  scope module: "api" do
    resources :posts, only: [:index, :show] do
      collection do
        get 'search'
      end
    end
  end
end

  1. 你的目录应该被命名app/controllers/api,而不是app/controllers/API
  2. 您的控制器应该app/controllers/api/posts_controller.rb使用类名,例如class Api::PostsController < ApplicationController

我还应该提到,我不知道或使用rocket_pants,但他们的自述文件也建议为模块中的不同版本设置命名空间控制器(上面的另一个级别的范围)。

于 2013-05-25T06:12:16.047 回答
-1

更好的“裤子火箭式”答案。

路线.rb

api :version => 1, module: "api" do
  resources :foobars

文件夹结构

-controllers
  -api
    foobars_controller.rb
    etc

api_controller.rb

class ApiController < RocketPants::Base

foob​​ars_controller.rb

class Api::EventsController < ApiController
  version 1
  etc
于 2013-09-28T04:52:24.647 回答