API调用不指向正确的控制器

时间:2016-06-07 16:57:53

标签: ruby-on-rails api rest

我有一个POST/PATCH api,其中包含以下路由:

  namespace :api, defaults: { format: 'json' } do

    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
      resources :cars, only: [:create, :update]
    end

    scope module: :v2, constraints: ApiConstraints.new(version: 2) do
      resources :cars, only: [:create, :update]
    end
  end

api_constraints我过滤掉了这样的请求:

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

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

现在我有一个旧客户端,它会在头请求中没有设置application / myname.myapp.v1而触发请求。这就是为什么我将默认请求指向v1。这适用于老客户。

但是,新客户端的请求也会由Api::V1::CarsController#create处理,因为范围的默认设置为true:v1。我没想到这是因为在新客户端我肯定会像这样设置标题:

    request['patch'](url)
        .send(encodeURI(JSON.stringify(car_json)))
        .set('Accept', 'application/json')
        .set('Accept', 'application/myname.myapp.v2')
        .set('Authorization', 'Token token=' + token)

为什么即使在ApiConstraints中我根据新标题过滤掉了新的控制器作用域,新请求也没有处理新的请求?

0 个答案:

没有答案