2009-10-19 6 views
0

J'ai une route dans mon code qui ressemble à ceci:avec des URLs de routage par nom au lieu d'ID

map.app 'applications/:title_header', :controller => 'apps', :action => 'show' 

J'ai aussi changé ma méthode d'exposition dans le contrôleur comme ceci:

@app = App.find_by_title_header(params[:title_header]) 

Si je tape applications/title les choses fonctionnent bien. Si je tape applications/1 (Id valide), il échoue (comme prévu)

Cependant quand je suis en train d'utiliser les aides d'URL amicales, dans ce cas app_path(@app) les URL générées ressemblent applications/1. La seule façon de le faire fonctionner est de mettre app_path(@app.title_header). Il semble que si "il sait juste" que l'ID est ce qui est passé à partir de l'objet d'application qu'il devrait "savoir" qu'il devrait par défaut passer le nom à la place maintenant. De quoi ai-je besoin pour changer?

+0

Alors, que se passe-t-il lorsque vous avez une adresse URL "1234" qui coïncide avec ID? – Zepplock

+0

Vous supposez que l'application est répertoriée en tant que ressource dans routes.rb. Même alors, route utilisera la première entrée correspondante qui décrit l'URL demandée. – EmFi

Répondre

0

En fait ce que j'ai fini par faire ne touchait pas to_param. Il devenait trop moche avec d'autres pages que j'avais qui avait besoin du to_param pour être un ID, pas un permalien.

J'ai fini par passer le @app.permalink aux méthodes d'URL au lieu de toucher to_param, mais celui-ci est toujours utile à savoir.

-1

Cela semble à peu près juste. Rails ne suppose pas que les symboles qu'il rencontre dans un itinéraire nommé sont des méthodes sur un objet. Le meilleur moyen de contourner cela est d'ajouter une aide personnalisée à application_helper.rb, qui crée la syntaxe que vous voulez utiliser et la transmet à une version plus basique de l'URL.

def my_app_path(object, args) 
    if object.responds_to? :title_header 
    app_path(object.title_header, args) 
    else 
    raise "Cannot generate url from object, missing title_header" 
    end 
end 
3

Easiest, solution la plus légère est d'utiliser simplement to_param:

class Application < ActiveRecord::Base 

    def to_param 
    title_header.parameterize 
    end 

end 

l'instance chaîne méthode parameterize assurera la chaîne est URL appropriée. Ensuite, dans vos contrôleurs, vous devrez juste mettre à jour tous les find s pour utiliser find_by_title_header au lieu de simplement find.

Assurez-vous que vous êtes title_header s sera unique!

+0

Merci J'ai fini par faire quelque chose comme ça ... –

Questions connexes