Как перейти к определенной пользовательской версии API Rails 5?

Я разрабатываю приложение, бэкэнд которого написан на рельсах 5 API (бета-версия).

У моего API будет несколько версий, и я использую этот подход для управления версиями:

https://github.com/iamvery/rails-api-example/blob/master/config/routes.rb

Rails.application.routes.draw do
  def api_version(version, &routes)
    api_constraint = ApiConstraint.new(version: version)
    scope(module: "v#{version}", constraints: api_constraint, &routes)
  end

  api_version(1) do
    resources :articles, only: :index
  end

  api_version(2) do
    resources :articles, only: :index
  end
end

Дело в том, что когда я не указываю версию, она показывает мне (очевидно) ошибку (ActionController::RoutingError: No route matches [GET] \...).

Но я бы хотел использовать последнюю версию API, а не выдавать ошибку.


person Pasp Ruby    schedule 13.02.2016    source источник
comment
Как вы хотите, чтобы URL-адрес выглядел, если не указана версия?   -  person Albin    schedule 30.03.2016
comment
Я передаю номер версии API через заголовок. Когда я не указываю конкретную версию, рельсы должны использовать версию по умолчанию.   -  person Pasp Ruby    schedule 03.04.2016


Ответы (2)


Ваш файл route.rb

Rails.application.routes.draw do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
# Then for a new version create a new scope
end    
end

Создайте новый файл api_constraints.rb в каталоге app/lib

class ApiConstraints
  def initialize(options)
    @version = options[:version]
    @default = options[:default]
  end
  def matches?(req)
    @default || req.headers['Accept'].include?("application/vnd.marketplace.v#{@version}")
  end
end
person Tequila_Tears    schedule 10.08.2016

Я бы добавил корневой маршрут и использовал простое перенаправление, например:

root to: redirect('/api/v2')

Я считаю, что это можно сделать динамически, немного изменив, что-то вроде этого:

@versions = []

def api_version(version)
  @versions << versions
  # The rest of your code..
end

root to: redirect("/v#{@versions.max}")

Надеюсь, это поможет.

person ekampp    schedule 24.06.2016