2010-01-16 4 views
4

Je développe actuellement un système de blogs avec Ruby on Rails et que vous souhaitez l'utilisateur de définir ses « permaliens » pour les pages statiques ou messages de blog, ce qui signifie:Permalinks avec Ruby on Rails (itinéraires dynamiques)

l'utilisateur doit être en mesure de définir le nom de la page, par exemple. "test-article" (qui devrait être disponible via/posts/test-article) - comment le réaliserais-je dans les applications rails et le fichier de routage?

Répondre

3

Modification de la méthode to_param dans le modèle est en effet nécessaire/pratique, comme les autres ont déjà dit: vous devez également modifier le contrôleur

def to_param 
    pagename.parameterize 
end 

Mais pour trouver les postes, puisque les méthodes par défaut Post.find recherche l'ID et non le nom de la page. Pour l'action show vous auriez besoin de quelque chose comme ceci:

def show 
    @post = Post.where(:pagename => params[:id]).first 
end 

même pour les autres méthodes d'action.

Vos règles de routage peuvent rester les mêmes que pour les routes régulières avec un numéro d'identification.

0

Vous devriez avoir l'attribut seolink ou permalink dans les objets des pages ou des postes. Ensuite, vous utiliseriez simplement la méthode to_param pour votre modèle de page ou de message qui retournerait cet attribut.

to_param méthode est utilisée dans *_path méthodes lorsque vous leur passez un objet.

Donc, si votre message a le titre « foo bar » et seolink « baz-quux », vous définissez une méthode to_param dans le modèle comme celui-ci:

def to_param 
    seolink 
end 

Puis, quand vous faites quelque chose comme post_path(@post) vous obtiendrez le /posts/baz-quux ou tout autre URL pertinent que vous avez configuré dans le fichier config/routes.rb (mon exemple s'applique aux URL de ressources). Dans l'action show de votre contrôleur, vous aurez juste à find_by_seolink au lieu de find[_by_id].

2

Personnellement, je préfère le faire de cette façon:

Mettez ce qui suit dans votre modèle Post (coller au fond avant la balise « end » de clôture)

def to_param 
    permalink 
end 

def permalink 
    "#{id}-#{title.parameterize}" 
end 

Voilà. Vous n'avez pas besoin de modifier l'une des méthodes find_by. Cela vous donne des URL du formulaire "123-title-of-post".

+0

Ceci est une mauvaise pratique SEO, car Google voit les premiers mots d'une URL comme plus important que ce dernier. – Houen

+0

@Houen suggérez-vous de supprimer l'ID?Sûrement quelques chiffres supplémentaires ne feront pas trop de différence/Avez-vous des liens vers des choses qui le rendent plus clair? Est-ce la même chose pour tous les moteurs de recherche (yahoo, bing, etc) Merci – stephenmurdoch

+0

Son acutally pas beaucoup sur les chiffres, car il s'agit du nombre de mots, et un tiret est considéré comme un séparateur de mots par Google. Les premiers mots portent le plus de poids SEO. Désolé, aucune référence de ceci, c'était quelque chose que les orateurs nous ont dit à Google IO 2010 – Houen

1

Les épisodes #63 et #117 peuvent vous aider. Consultez également les ressources là-bas.

2

Vous pouvez utiliser la gemme friendly_id. Il n'y a pas de changements de contrôleurs spéciaux requis. Simple ajouter un attribut par exemple slug à votre modèle .. pour plus de détails, consultez le repo github de la gemme.