2013-04-02 21 views
3

我一直在关注versioning an API using Rails routing发布的优秀解决方案,但我一直运行到无限重定向。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.jsonapi/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 

回答

2

不知道为什么在贴出的问题瑞安比格斯答案不工作了,但是这是我为了解决它改成了:

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