Ruby on Rails API 命名空间作为默认路径

Ruby on Rails API namespace as default path

提问人:Abdel P. 提问时间:11/6/2020 最后编辑:Abdel P. 更新时间:11/7/2020 访问量:393

问:

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

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

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

当我调用它时可以工作,但是当我尝试省略 URL 中的命名空间时它不起作用,我是否需要进行任何额外的配置?http://api.mydomain.com/v1/therapists/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 命名空间

评论


答:

1赞 Joe Hampton 11/6/2020 #1

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

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

评论

0赞 Abdel P. 11/6/2020
那么让我编辑我的问题,有没有办法使用特定版本作为默认版本,以防我有 1 个以上?
1赞 zhisme 11/6/2020 #2

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

因此,将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

有一篇相当不错的文章描述了不同的解决方案,请查看更多详细信息。