我希望我的应用程序中的控制器不仅仅响应从其路由发送的对象的id,而且实际上是sha1哈希,我使用Digest::SHA1.hexdigest
生成。
所以而不是:
/client/invoice/1
我希望网址类似于:
/client/invoice/0beec7b5ea3f0fdbc95d0
答案 0 :(得分:6)
在Rails中更改对象的URL通常涉及两件事:
首先,更改相关的控制器操作以使用以您希望的方式工作的查找程序。在您的情况下,您可能希望在发票模型中编写自定义查找器,例如:
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])
(显示,编辑,更新,销毁)。
其次,更改生成的网址以遵循新设计(如果需要)。因此,如果您希望link_to("Jan 1, 2010", @invoice)
转到/client/invoice/0beec7b5ea3f0fdbc95d0
,请覆盖发票模型中的默认to_param
方法。例如:
def to_param
sha1
end
(假设您的发票的SHA1哈希值存储在sha1属性中。)
答案 1 :(得分:1)
Invoice.first(:conditions=>["SHA(id) = ?",params[:id]])