Подстановочное сопоставление для Rails API Versioning вызывает бесконечное перенаправление

Я следил за отличным решением, опубликованным здесь относительно версии API с использованием Rails-маршрутизации, но я продолжаю работать в бесконечном перенаправлении.

Вот раздел моего routes.rb

  namespace :api do

    namespace :v1 do
      resources :books
    end

    namespace :v2 do
      resources :books
    end

    match 'v:api/*path', :to => redirect("/api/v2/%{path}")
    match '*path', :to => redirect("/api/v2/%{path}")

  end

что практически совпадает с опубликованным ответом. Доступ к /api/v1/books/list.json работает так, как ожидается, api/v2/books/list.json. У меня проблема с /api/books/list.json, которая должна перенаправляться на /api/v1/books/list.json. Если я попытаюсь получить доступ к api, не указав, какую версию, мой браузер отвечает бесконечным перенаправлением. Мои журналы выглядят следующим образом:

Started GET "/api/books/list.json?max_number=10" for 127.0.0.1 at 2013-04-01 22:00:51 -0400


Started GET "/api/v1/books%2Flist" for 127.0.0.1 at 2013-04-01 22:00:51 -0400


Started GET "/api/v1/books%2Flist" for 127.0.0.1 at 2013-04-01 22:00:51 -0400


Started GET "/api/v1/books%2Flist" for 127.0.0.1 at 2013-04-01 22:00:51 -0400

//... and so on

Ответ 1

Не знаю, почему ответ Райана Биггса в заданном вопросе больше не работает, но это то, к чему я его изменил, чтобы его решить:

  namespace :api do

    namespace :v1 do
     resources :books do
      collection do
       get 'list'
       get '/*path', :to => redirect("http://localhost:3000")
      end
     end
    end

    namespace :v2 do
     resources :books do
      collection do
       get 'list'
      end
     end
    end


  match 'v:api/*path', :to => redirect{|params, req|
    "/api/v1/#{params[:path]}.#{params[:format]}#{params[:query_string]}?#{req.query_string}"
  }
  match '*path', :to => redirect{|params, req|
    "/api/v1/#{params[:path]}.#{params[:format]}#{params[:query_string]}?#{req.query_string}"
  }
end