2009-12-22 5 views
2

Je veux que mon contrôleur dans mon application ne répond pas seulement à l'id de l'objet envoyé à partir de son itinéraire, mais en fait un hachage sha1, j'ai généré en utilisant Digest::SHA1.hexdigest.rails sha1 hachage pour route à l'objet?

Ainsi, au lieu de:

/client/invoice/1 

Je veux l'URL pour être quelque chose comme:

/client/invoice/0beec7b5ea3f0fdbc95d0 

Répondre

6

Modification de l'URL d'un objet dans Rails implique généralement deux choses:

Tout d'abord, modifiez les actions de contrôleur appropriées pour utiliser un outil de recherche qui fonctionne comme vous le souhaitez. Dans votre cas, vous voulez probablement écrire un viseur personnalisé dans votre modèle de facture, comme:

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

puis utilisez Invoice.find_by_id_or_sha1(params[:id]) dans vos actions de contrôleur (Afficher, modifier, mettre à jour, détruire). Deuxièmement, modifiez les URL générées pour suivre votre nouveau design (si vous le souhaitez). Donc, si vous voulez que link_to("Jan 1, 2010", @invoice) passe à /client/invoice/0beec7b5ea3f0fdbc95d0, remplacez la méthode to_param par défaut dans votre modèle de facture. Par exemple:

def to_param 
    sha1 
end 

(Cela suppose votre hash SHA1 de facture est stockée dans l'attribut SHA1.)

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

pas vraiment une solution tout à fait, mais bonne idée! +1, bienvenue également à stackoverflow! –

+2

Non sécurisé. Devrait inclure un sel sinon tout le monde peut simplement faire un SHA (int) pour trouver l'URL de chaque facture. – Espen