views:

214

answers:

4
+2  Q: 

:id in URLs

I'm still new to ROR, so pardon the simplicity of the question...

So http://www.example.com/controller/:id displays a record in my table, with :id being a number (1,2,3 etc.).

Is there a way I can have :id in the URL be the value of a field in the displayed record? Such that I can have http://www.example.com/controller/record_field ?? I want to have a human-friendly reference to specific records in my table...I'm sure this must be possible. Do I change something in routes.rb?

Thanks for the help!

+4  A: 

The cleanest way is to add a new find method in your model (or simply use the find_by_fieldname Rails gives you in your control). Then you'll have your controller use that method instead of the regular find(params[:id]) to pull your model record.

Check out Ryan B's screencast on this here. It's pretty easy, and he's a good teacher, so you shouldn't have any problems.

Jon Smock
A: 

Excellent - I was just watching some of his other screencasts; must have missed this one. Thanks!

neezer
Yeah he's pretty awesome. I've learned a lot watching those screencasts. Good luck!
Jon Smock
A: 

I use the excellent rails plugin named friendly_id.

http://github.com/norman/friendly_id/tree/master

That should sort you out nicely. It is well documented too.

Take care around fields that might have modern Greek characters—might need to figure a work around for those.

Tim Harding
A: 

Jon Smock's solution will work, too. I tend to prefer the following.

class Hamburger << ActiveRecord::Base

  #this normally defaults to id
  def to_param 
     name
  end

end

class SomeModelController << ApplicationController

  def show 
    @hamburger = Hamburger.find(params[:id])  #still default code
  end
end

#goes in some view
This is the <%= link_to "tastiest hamburger ever", url_for(@hamburger) %>.

This is, loosely speaking, an SEO technique (beautiful URLs are also user-friendly and I suggest them to absolutely everyone even if you don't care about SEO, for example on pages behind a login). I have a more extended discussion of Rails SEO, which includes other tips like this, here.

Important tip: You should consider, at design-time, what you are going to do if the param should change. For example, in my hamburger scenario, it is entirely possible that I might rename "Sinfully Delicious Cheeseburger" to "Triple Bypass". If that changes URLs, there are some possible implications, such as breakage of customer links to my website. Accordingly, for production use I usually give these models an immutable permalink attribute which I initialize to be human-meaningful exactly once. If the object later changes, oh well, the URL stays the same. (There are other solutions -- that is just the easiest one.)

Patrick McKenzie