views:

392

answers:

2

Hey,

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.heroku.com/blog/styling-rails-urls, instead of /id/slug it suggests to use /id-slug which works perfectly for me, so I'll go with this.

+3  A: 

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'
Corey
+1  A: 

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
Toby Hede
Yes, this is what I have in UPD. I actually used this approach too.
Vitaly