I'm trying to achieve URLs like this in Rails:
http://localhost/posts/1234/post-slug-name
with both ID and slug name instead of either
http://localhost/posts/1234
or
http://localhost/posts/post-slug-name
(right now I have just slug name in URL, so this part is over). How can I do this?
UPD
I found an article on this: http://augustl.com/blog/2009/styling_rails_urls/, instead of /id/slug
it suggests to use /id-slug
which works perfectly for me, so I'll go with this.
You'll want to add a regular route with Route Globbing in addition to your resource route (assuming of course that's how your posts
routes are defined). For example,
map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
Rails has some built-in support for SEO friendly URLs.
You can create a url in the form: "id-title" by simply overriding the to_param method in your model.
This is from one of my projects and creates a url with the id, category name and model name:
def to_param
"#{id}-#{category.name.parameterize}-#{name.parameterize}"
end
Rails is smart enough to extract this back into the plain id when you access your controller action, so the following just works:
def show
@model = Model.find(params[:id])
render :action => "show"
end
Use friendly_id. It has one nice feature: you can update your url without breaking the old one.
Generating view url isn't working for me. I just added a small method in the model
def to_param
self.friendly_id
end
I know the question is quite old but I think it still deserves some interest and none of the answers are up-to-date or provide a way to generate exactly what the OP was looking for (i.e. http://localhost/posts/1234/post-slug-name
).
In routes.rb
get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'
Then in the views
<%= link_to slugged_post_path(post, post.name.parameterize) %>
You might want to define a slug method in your model to avoid calling parameterize in the views.
the stringex gem contains ActsAsUrl to create URI-friendly representations of an attribute
https://github.com/rsl/stringex
It also contains a Unidecoder library, which can convert Unicode to ASCII.
I wrote a post about slugs in Rails 3. It provides pretty URL's and even more, secures your site from random scripts that ask for information just by increasing ID's. Also it avoids saving slugs in the database.