Make it easy to use handles (callsigns/monikers/usernames) in URLs, even if they might be blank.
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test
.document
.gitignore
LICENSE
README.rdoc
Rakefile
VERSION

README.rdoc

has_handle_fallback

Make it easy to use handles (callsigns/monikers/usernames) in URLs, even if they might be blank.

Quickstart

class Person < ActiveRecord::Base
  has_handle_fallback :email
end

This assumes that Person has the fields handle and email.

class PeopleController < ActionController::Base
  def object
    @object ||= Person.find_by_id_or_handle(params[:id])
  end
end

Then you can safely use Person#to_param in URLs, etc. because, when in doubt, the finder will use the numeric ID.

Long forms:  Person.find_by_id_or_handle('pierrebourdieu'), Person.find_by_id_or_handle(1)
Short forms: Person['pierrebourdieu'], Person[1]

What's going on?

def test_only_uses_handle_as_param_when_not_changed_from_value_in_database
  pierre = Person.new :email => 'pierre.bourdieu@example.com'

  # not saved, so to_param is just blank
  assert_equal '', pierre.to_param
  assert_equal nil, Person[pierre.to_param]

  # no handle set, so to_param is integer primary key
  pierre.save!
  assert_equal pierre.id.to_s, pierre.to_param
  assert_equal pierre, Person[pierre.to_param]

  # handle is set, but not saved, so STILL use integer primary key
  pierre.handle = 'pierrebourdieu'
  assert_equal pierre.id.to_s, pierre.to_param
  assert_equal pierre, Person[pierre.to_param]

  # now handle is saved, so we can use it as the param
  pierre.save!
  assert_equal 'pierrebourdieu', pierre.to_param
  assert_equal pierre, Person[pierre.to_param]

  # handle was changed, so let's use the integer primary key until it's saved again
  pierre.handle = ''
  assert_equal pierre.id.to_s, pierre.to_param
  assert_equal pierre, Person[pierre.to_param]
end

Copyright

Copyright © 2010 Seamus Abshere. See LICENSE for details.