适当的api命名空间路由

问题描述 投票:0回答:1

rails routes.rb文件中定义了以下路由:

require 'apiconstraints'

Rails.application.routes.draw do
  namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: '/'  do
    scope module: :v1, constraints: Apiconstraints.new(version: 1, default: true) do
      resources :buildings, only: [:show, :index] do

我还尝试用空白定义路径:

  namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: ''  do

无济于事。 nginx sites-enabled文件配置如下:

server {
    listen 80;
    server_name api.thedomain.ws [...] thedomain.ws www.thedomain.ws

api.thedomain.ws回应。但是,如果我调用api.thedomain.ws/v1/buildings rails返回No路由匹配[GET]“/ v1 / buildings”

为了完整性:

class Apiconstraints
  def initialize(options)
    @version = options[:version]
    @default = options[:default]
  end

  def matches?(req)
    @default || req.headers['Accept'].include?("application/vnd.v4.v#{@version}")
  end
end

我在这里想念的是什么?

ruby-on-rails nginx
1个回答
0
投票

namespace宏在路径中添加了“命名空间”:

Rails.application.routes.draw do
  namespace :api do
    resources :things
  end
end

        Prefix Verb   URI Pattern                    Controller#Action
    api_things GET    /api/things(.:format)          api/things#index
               POST   /api/things(.:format)          api/things#create
 new_api_thing GET    /api/things/new(.:format)      api/things#new
edit_api_thing GET    /api/things/:id/edit(.:format) api/things#edit
     api_thing GET    /api/things/:id(.:format)      api/things#show
               PATCH  /api/things/:id(.:format)      api/things#update
               PUT    /api/things/:id(.:format)      api/things#update
           DELETE /api/things/:id(.:format)      api/things#destroy

哪个是使用它的要点。不要将路由名称空间的Rails概念与模块嵌套的语言级功能混淆。

如果您只想将控制器嵌套在模块中或添加约束,请使用scope

Rails.application.routes.draw do
  scope module: :api do
    resources :things
  end
end

    Prefix Verb   URI Pattern                Controller#Action
    things GET    /things(.:format)          api/things#index
           POST   /things(.:format)          api/things#create
 new_thing GET    /things/new(.:format)      api/things#new
edit_thing GET    /things/:id/edit(.:format) api/things#edit
     thing GET    /things/:id(.:format)      api/things#show
           PATCH  /things/:id(.:format)      api/things#update
           PUT    /things/:id(.:format)      api/things#update
           DELETE /things/:id(.:format)      api/things#destroy

所以在你的情况下你想要:

scope defaults: { format: :json }, module: :api, constraints: { subdomain: 'api' } do
  scope module: :v1, constraints: Apiconstraints.new(version: 1, default: true) do
    resources :buildings, only: [:show, :index]
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.