Resource fu plugin

Plugin details

Resource Fu is a collection of hacks and techniques that have been used in projects that need nested and/or polymorphic resources.

Repositoryhttp://svn.protocool.com/public/plugins/resource_fu/ Author Trevor Squires Tags polymorphic LicenseMIT

Documentation

Install the plugin:
ruby script/plugin install http://svn.protocool.com/public/plugins/resource_fu/

Add this to routes.rb:

map.resources :artists do |artist|
	artist.resources :albums do |album|
		album.resources :songs
	end
end



The standard resource helpers generated for 'albums' require that you always specify the artist_id:

album_path(@artist, @album)



And, if you want to have additional parameters (such as a :page number when paginating) you can't use the positional arguments form (above) when calling the url helper, you have to use a hash for everything:

album_path(:artist_id => @artist, :id => @album, :page => 2)



Also, the standard resource helpers fill in the route by processing your positional arguments from left-to-right.

album_path(@album) == album_path(:artist_id => @album)



ResourceFu changes the way url helpers behave - and it does it in a way that avoids costly per-request evals and/or route re-recognition.
With ResourceFu your positional arguments are 'anchored' on the right of the route: which means that if your route has three segments and you only supply two positional arguments, the url helper assumes you are supplying the *last* two segments.
Using the above example of artists, albums and songs:

song_path(@album, @song) == song_path(:album_id => @album, :id => @song)



However, the route for song_path is still missing a critical piece of information, namely the artist_id.
ResourceFu tries to 'guess' that value with a simple convention:
Any route segments that are missing are filled in by looking for instance variables with a relevant name. So in the example:

song_path(@album, @song)



ResourceFu will try to set the :artist_id param by first looking for an instance variable called @artist and then falling back to looking for an instance variable called @artist_id.
In album_controller.rb:

def show
  @artist_id = params[:artist_id] # or fetch the actual Artist if you want
  @album = Album.find(params[:id], :conditions => {:artist_id => @artist_id})
	@album.songs.each do |song|
		song_path(song) #=> /artists/@artist_id/albums/@album.id/songs/song.id
	end
end



Finally, if you want additional, non-route-segment params, you *don't* have to completely switch to the hash-argument style for route helpers:

song_path(@artist, @album, @song, :page => 2, :per_page => 20)

Further Documentation

There is currently no advanced documentation for this plugin.

New documentation

Edit plugin | (0 older versions) | Last edited by: scott, about 1 year ago