2016-02-13 7 views
4

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

Мой 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 

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

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

+0

Как вы хотите, чтобы URL, чтобы посмотреть, когда не указав версию? – Albin

+0

Я передаю номер версии api через заголовок. Когда я не укажу конкретную версию, рельсы должны использовать значение по умолчанию. –

ответ

0

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

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

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

@versions = [] 

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

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

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

2

Файл routes.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