【问题标题】:Routing to different controllers having same name at different locations路由到在不同位置具有相同名称的不同控制器
【发布时间】:2013-05-25 05:50:50
【问题描述】:

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

我将处理 HTTP 请求的控制器存储在 app/controllers 中,将处理 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

【问题讨论】:

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


    【解决方案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

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

    【讨论】:

    • 非常感谢。我会按照你的建议深入研究路由的范围。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2022-01-14
      • 2013-09-24
      • 2016-03-29
      • 1970-01-01
      相关资源
      最近更新 更多