ID + nom Slug dans l'URL dans Rails (comme dans StackOverflow)
-
26-09-2019 - |
Question
Je suis en train de réaliser des URL comme celui-ci dans Rails:
http://localhost/posts/1234/post-slug-name
à la fois ID et le nom limace au lieu de soit
http://localhost/posts/1234
ou
http://localhost/posts/post-slug-name
(en ce moment j'ai simplement le nom limace dans l'URL, de sorte que cette partie est terminée). Comment puis-je faire?
UPD
J'ai trouvé un article sur ce point: http://augustl.com/blog/2009/styling_rails_urls/ , au lieu de /id/slug
il suggère d'utiliser /id-slug
qui fonctionne parfaitement pour moi, donc je vais avec cela.
La solution
Vous aurez envie d'ajouter un itinéraire régulier avec Route englobement en plus à votre itinéraire de ressources (en supposant bien sûr que comment vos routes posts
sont définies). Par exemple,
map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
Autres conseils
Rails a une prise en charge intégrée pour les URL SEO friendly.
Vous pouvez créer une url sous la forme:. "Id-titre" en remplaçant simplement la méthode to_param dans votre modèle
Ceci est l'un de mes projets et crée une URL avec l'identifiant, le nom de la catégorie et le nom du modèle:
def to_param
"#{id}-#{category.name.parameterize}-#{name.parameterize}"
end
Rails est assez intelligent pour extraire ce retour dans l'id simple lorsque vous accédez à votre action de contrôleur, de sorte que le suivant fonctionne simplement:
def show
@model = Model.find(params[:id])
render :action => "show"
end
Utilisez friendly_id . Il dispose d'une fonctionnalité intéressante. Vous pouvez mettre à jour votre URL sans casser l'ancien
vue Génération url ne fonctionne pas pour moi. Je viens d'ajouter une petite méthode dans le modèle
def to_param
self.friendly_id
end
Je sais que la question est assez vieux, mais je pense qu'il mérite encore un certain intérêt et aucune des réponses sont mises à jour ou fournir un moyen de générer exactement ce que l'OP cherchait (c.-à-http://localhost/posts/1234/post-slug-name
).
Dans routes.rb
get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'
Ensuite, dans les vues
<%= link_to slugged_post_path(post, post.name.parameterize) %>
Vous pouvez définir une méthode slug dans votre modèle pour éviter d'appeler Paramétrez dans les vues.
la pierre précieuse stringex contient ActsAsUrl pour créer des représentations URI-friendly d'un attribut
https://github.com/rsl/stringex
Il contient également une bibliothèque Unidecoder, qui peut convertir Unicode en ASCII.
j'ai écrit un post sur les limaces dans Rails 3. Il fournit assez URL et plus encore , sécurise votre site à partir de scripts aléatoires qui demandent des informations simplement en augmentant son ID. Il évite aussi sauver les limaces dans la base de données.