路由到不同位置具有相同名称的不同控制器

时间:2013-05-25 05:50:50

标签: ruby-on-rails api rails-routing

我正在使用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呢?

2 个答案:

答案 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

另外

  1. 您的目录应命名为app/controllers/api,而不是app/controllers/API
  2. 您的控制器应位于app/controllers/api/posts_controller.rb,类名称为class Api::PostsController < ApplicationController
  3. 我还应该提一下,我不知道或使用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
相关问题