2009-12-22 71 views
2

我想我的控制器在我的應用程序不只是響應從它的路由發送的對象的ID,但實際上是一個sha1哈希,我已經使用Digest::SHA1.hexdigest生成。rails sha1哈希路由到對象?

所以不是:

/client/invoice/1 

我想要的網址是這樣的:

/client/invoice/0beec7b5ea3f0fdbc95d0 

回答

6

更改URL在Rails的對象通常包括兩件事情:

首先,更改相關的控制器操作以使用按照您希望的方式工作的查找器。在你的情況,你可能想要寫一個自定義查找在你的發票模型,如:

def self.find_by_id_or_sha1(id) 
    Invoice.find_by_id(id) || Invoice.find_by_sha1(id) 
end 

,然後用你的控制器動作(顯示,編輯,更新,銷燬)Invoice.find_by_id_or_sha1(params[:id])

其次,更改生成的URL以遵循您的新設計(如果需要)。因此,如果您希望link_to("Jan 1, 2010", @invoice)轉至/client/invoice/0beec7b5ea3f0fdbc95d0,請覆蓋Invoice模型中的默認to_param方法。例如:

def to_param 
    sha1 
end 

(即假定您的發票的SHA1哈希存儲在SHA1屬性。)

1
Invoice.first(:conditions=>["SHA(id) = ?",params[:id]]) 
+0

不是一個真正的完全的解決方案,但不錯的主意! +1,也歡迎來到stackoverflow! – 2009-12-23 03:22:31

+2

不安全。應該包含鹽,否則任何人都可以執行SHA(int)來查找每個發票的URL。 – Espen 2010-10-17 20:50:39