rails sha1 hash for route to object?

时间:2009-12-22 04:08:48

标签: ruby-on-rails ruby

我希望我的应用程序中的控制器不仅仅响应从其路由发送的对象的id,而且实际上是sha1哈希,我使用Digest::SHA1.hexdigest生成。

所以而不是:

/client/invoice/1

我希望网址类似于:

/client/invoice/0beec7b5ea3f0fdbc95d0

2 个答案:

答案 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]])