2011-04-27 26 views
3

在我的routes.rb這個試圖重寫規則可能是不言自明的:如何在Rails路徑中使用正則表達式來進行重定向?

match "/:user/:photo-thumb.png" => 
     redirect("/%{user}/photos/%{photo}/image?style=thumb"), 
     :photo => /[a-zA-Z]+/ 

我想重定向像mysite.com/alice/foo-thumb.png到mysite.com/alice/photos/ foo/image?style = thumb

雖然上面的嘗試是錯誤的。任何想法修復它?

+0

這是最後一個正則表達式的約束嗎? – DGM 2011-04-27 04:12:51

+0

@DGM這只是我試圖獲得的一部分:照片以匹配「-thumb」之前的部分。 – dreeves 2011-04-27 05:12:16

回答

4

以下爲我工作:

match "/:user/:photo_thumb.png" => 
     redirect{|p| 
     "/#{p[:user]}/photos/#{p[:photo_thumb].split('-')[0]}/image?style=thumb" 
     }, 
     :constraints => { :photo_thumb => /[a-zA-Z]*\-thumb/ } 

我很想找到一種簡單的方法來做到這一點,雖然。 (正如tadman指出的那樣,我可能更適合用nginx重寫。請參閱相關問題:Routes.rb vs rack-rewrite vs nginx/apache rewrite rules

+2

或者,如果不知道這裏的大圖,請查看回形針來處理圖像附件... railscast here:http://railscasts.com/episodes/134-paperclip – DGM 2011-04-27 14:15:49

3

你可能有更多的運氣是這樣的:

match "/:user/:photo.png" => 
    redirect("/%{user}/photos/%{photo}/image?style=thumb"), 
    :photo => /\w+\-thumb/ 

路由標記可以通過在它們的附加內容相混淆。

需要注意的是,這種事情通常更好地在Web服務器級別處理,如Apache,nginx或lighttpd,其中重定向不會捆綁Rails堆棧的實例。擁有大量映射表的情況在具有大量舊式鏈接的應用程序中並不罕見。

+0

謝謝@tadman!我認爲這在我的情況下並不奏效,因爲在您有%{photo}的重寫網址中,它不需要包含「-thumb」。 – dreeves 2011-04-27 05:05:19

+0

看起來你已經觸及到了一個可能的解決方法,使用'redirect'的塊版本來做一些簡單的字符串修改。 – tadman 2011-04-27 15:13:01