2009-12-22 68 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