【问题标题】:Ruby on Rails API namespace as default pathRuby on Rails API 命名空间作为默认路径
【发布时间】:2021-02-18 12:37:35
【问题描述】:

我正在按照本教程设置我的 Rails API 服务器:building-awesome-rails-apis-part-1

一切都很好,除了提到不需要在路由中指示命名空间的部分。例如。

现在我们的 URL 看起来像:http://api.example.com/v1/people 或者只是 http://api.example.com/people如果你不使用版本,它 不会干扰你的普通人的路线,而且看起来很棒。

当我调用 http://api.mydomain.com/v1/therapists/ 时它可以工作,但是当我尝试在 URL 中省略 v1 命名空间时它不起作用,我需要做任何额外的配置吗?

我正在使用Rails 6.0.3.4

这是我具体的 routes.rb 文件:

Rails.application.routes.draw do
  namespace :api, :path => "", :constraints => {:subdomain => "api"} do
    namespace :v1 do
      resources :therapists do
        resources :appointments
      end
    end
  end
end

解决方案

按照 zhisme 的建议,我使用 rack-rewrite gem 来做我想做的事情。

首先,我将 gem 添加到我的 Gemfile 中:

gem 'rack-rewrite', '~> 1.5', '>= 1.5.1'

之后我在config/application.rb文件中添加了配置

  config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
    rewrite '/therapists', '/v1/therapists'
  end

它奏效了。

【问题讨论】:

    标签: ruby-on-rails ruby api namespaces


    【解决方案1】:

    为了实现这一点,您需要在Rack 内插入代码。有一个 gem rack-rewrite 可以在 Rails 代码执行之前进行重定向,因此在 Rails 路由解析之前。检查他们的 README 以进行安装。

    所以根据您的问题修改 README 示例,您可以执行类似的操作

    config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
      rewrite '/api/therapists/appointments', '/api/v1/therapists/appointments'
    end
    

    或者您可以进行重定向,让您的 api 使用者知道正确的 url 有点不同

    config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
      moved_permanently '/api/therapists/appointments', '/api/v1/therapists/appointments'
    end
    

    有相当不错的article描述了不同的解决方案,看看更多细节。

    【讨论】:

      【解决方案2】:

      如果您在 URL 中省略了 v1 命名空间,您还必须将其从您的 routes.rb 文件中删除。

      教程中的引文指出“如果你不使用该版本,或者只是 http://api.example.com/people”,这意味着如果你没有在 routes.rb 文件中包含 v1 命名空间。

      【讨论】:

      • 那么让我编辑我的问题,有没有办法使用特定版本作为默认版本,以防我拥有超过 1 个版本?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2018-07-25
      • 2011-05-05
      • 1970-01-01
      • 2012-03-11
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多