3

我正在关注此处发布的关于使用 Rails 路由对 API 进行版本控制的出色解决方案,但我一直遇到无限重定向。

这是我的一部分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
4

1 回答 1

2

不知道为什么 Ryan Biggs 在发布的问题中的回答不再起作用,但这就是我为了解决它而将其更改为:

  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
于 2013-04-02T04:16:59.227 回答