rails sha1 hash для маршрута к объекту? - PullRequest
2 голосов
/ 22 декабря 2009

Я хочу, чтобы мой контроллер в моем приложении не просто отвечал на id объекта, отправленного с его маршрута, но на самом деле хэш sha1, сгенерированный с помощью Digest::SHA1.hexdigest.

Так что вместо:

/client/invoice/1

Я хочу, чтобы URL был примерно таким:

/client/invoice/0beec7b5ea3f0fdbc95d0

Ответы [ 2 ]

6 голосов
/ 22 декабря 2009

Изменение URL для объекта в Rails обычно включает две вещи:

Сначала измените соответствующие действия контроллера, чтобы использовать искатель, который работает так, как вы хотите. В вашем случае вы, вероятно, захотите написать собственный искатель в своей модели Invoice, например:

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, переопределите метод to_param по умолчанию в вашей модели Invoice. Например:

def to_param
  sha1
end

(Предполагается, что хэш SHA1 вашего счета хранится в атрибуте sha1.)

1 голос
/ 22 декабря 2009
Invoice.first(:conditions=>["SHA(id) = ?",params[:id]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...