2011-02-14 39 views
10

我想在Rails 3中實現一個通用的虛榮URL系統。泛型的意義上,虛榮URL不綁定到特定的模型。它類似於Vanities的寶石,我有一個VanityUrlController從所有的虛榮網站中擊中。區別在於我不想做一個從foo.com/usernamefoo.com/users/1foo.com/product-namefoo.com/products/1的外部重定向。我希望虛榮URL能夠堅持下去,讓VanityUrlContoller做一個內部重定向,模仿相應的顯示操作。與Rails的內部重定向3

我知道什麼控制器和動作我想分配內部重定向到,但我有實際調度它的問題。這是我的時刻,其中:

TargetController.new.process("show", request.env) 

它似乎開始處理新的「請求」,但也有關鍵件失蹤......像實際的請求對象。

任何想法或指針將不勝感激。

更新:

我在對面ActionController的調度方法,這似乎讓我有點遠跑。

TargetController.new.dispatch("show", request) 

我有兩個問題,1),它被列爲私有API方法,所以如果有另一種方式來做到這一點,我寧願認爲,和2),即使它被渲染秀TargetController的模板,它抱怨「Missing template vanity_urls/show」。

UPDATE

這是我們想出瞭解決方案的基礎。我們還做了一些其他的事情,比如強制編碼和檢查一些其他應用程序特定的東西,但這應該是你需要的一切。

這個文件位於routes.rb文件的最底部,因此您的虛榮路線不會打斷您的其他指定路線。

# Vanity routes. 
match ':id', :as => 'vanity', :to => proc { |env| 
    id = env["action_dispatch.request.path_parameters"][:id] 

    vain_object = <method to find the object you want to display> 
    if vain_object.nil? 
    # render your 404 page 
    'application#404' 
    else 
    model = vain_object.class.model_name 
    # figure out the controller you want to go to 
    controller = [model.pluralize.camelize,"Controller"].join.constantize 
    # reset the :id parameter with the id of the object to be displayed 
    env["action_dispatch.request.path_parameters"][:id] = vain_object.id 
    # do your internal redirect 
    controller.action("show").call(env) 
    end 
} 

您在創建虛榮路線時也要小心,以免它們與您的其他控制器發生衝突。其他一些有用的東西,以瞭解是:

Rails.application.routes.routes.any? { |r| r.requirements[:controller] == vanity_url } 

告訴你,如果你vanity_url具有相同的名稱作爲當前控制器。

Rails.application.routes.recognize_path("/#{vanity_url}", :method => :get) 

它告訴你這是否映射到任何東西。

當然,一路上有幾個黑客,但它像一個魅力。

+0

下面是一個類似的選項,lambda提取出來並約束應用http://stackoverflow.com/questions/5641786/testing-rack-routing-using-rspec – Agustin 2012-03-30 17:17:38

回答