2009-09-05 7 views
2

J'ai créé des objets de modèle de générer un échafaudage, mais maintenant je veux au lieu de lier à
/: controller /: id (/ objectname/1) à/: controller /: title (/ objectname/nouveau_blog_post). Comment est-ce que je fais ceci pour que les liens corrigent le lien vers le titre et pas l'identification?Ruby on rails: URL des identifiants aux noms/titres etc

Je veux aller de:

/:controller/:id 

à

/:controller/:name 

Répondre

4

Utilisez PARAM

class User < ActiveRecord::Base 

    def to_param 
    name.blank? ? id : name 
    end 

end 

Ou regarder dans un plug-in, et acts_as_sluggable friendly_id sont ceux que je connais.

EDIT: Oh oui et comme mentionné, assurez-vous que tout ce que vous utilisez est unique.

EDIT:

il travaillerait comme:

class UsersController < ActionController::Base 

    def index 
    @users = User.all 
    end 

end 

Vu:

<% @users.each do |user| %> 
    <%= link_to user.name, user_path(@user.id) %> 
<% end %> 

Et si le même nom d'utilisateur est John alors il render/utilisateurs/John après avoir cliquez sur ce lien

+0

+1 Vous savez, je n'ai jamais remplacé 'to_param'.Peut-être que je devrais commencer à faire ça. – theIV

+0

En fait, en regardant à nouveau, serait-ce une bonne idée? Si le nom était vide, à quoi ressemblerait sa trouvaille dans le contrôleur? – theIV

+0

Il est toujours trouver avec un id, le blanc cocher pour mettre l'id comme l'URL s'il n'y a pas de nom. Ce n'est pas testé, mais cela démontre une idée de base. – nitecoder

1

Vous aurez besoin de changer quelques petites choses:

Vous devrez passer l'attribut title à tous les chemins/urls quand vous faites des choses comme par exemple link_to

post_path(@post) 

deviendra

post_path(@post.title) 

Vous devrez également mettre à jour vos trouvailles pour rechercher les messages par titre, par opposition à id par exemple

@post = Post.find(params[:id]) 

deviendra

@post = Post.find_by_title(params[:title]) 

Cela devrait vous aider à démarrer :). Vous aurez évidemment envie de battre le titre et de valider l'unicité du titre.

EDIT: Après avoir lu la réponse de Robert Elwell, j'ai peut-être mal compris la question. Avez-vous déjà un itinéraire comme celui que vous avez décrit pour un objet spécifique, ou faites-vous cela avec les routes «de base»? Si c'est le cas, il vaut mieux écrire un itinéraire personnalisé comme le suggère Robert, et ensuite faire ce que j'ai suggéré.

0

Utilisez friendly_id.

BTW, la génération d'URL ne fonctionne pas pour moi. J'avais écrit le mien au modèle

def to_param 
    self.friendly_id 
end