Forum: Ruby on Rails methods or actions? ask or tell?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
James B. (Guest)
on 2009-06-03 21:10
I have been pondering a routing issue for the past few days.  This is an
area of Rails that I have only recently started to study in any detail.
So, I would appreciate any information you can give regarding the
preferred approach to my situation.

In our new application we maintain a collection of foreign currency
exchange rates.  For the moment, these come from a single source.
However, it is already known that a second source will be used in the
future.

As with most Rails applications, the exchange rates have a surrogate
primary key.  They also have a unique index on the following columns,
the real primary key:

  :currency_code_base, :currency_code_quote, :effective_from, :type

The application requirements given as how I see them in REST style
routing are:

default currency => 'CAD'
http verb => :get

/forex
  => most recent rate for every currency, quoted in default currency,
sorted by currency code

/forex/yyyy
  => all rates for all currencies for given year, quoted in default
currency, sorted by currency code by date

/forex/yyyy/mm
  => all rates for all currencies for given month, quoted in default
currency, sorted by currency code by date

/forex/yyyy/mm/dd
  => rate for every currency effective on given date, quoted in default
currency, sorted by currency code by date

/forex/XXX
  => most recent rate for currency code XXX quoted in default currency

/forex/XXX/yyyy
  => rates for currency code XXX for given year, quoted in default
currency sorted by date

/forex/XXX/yyyy/mm
  => rates for currency code XXX for given year, and month quoted in
default currency sorted by date

/forex/XXX/yyyy/mm/dd
  => rates for currency code XXX for given date, quoted in default
currency sorted by date

/forex/XXX/yyyy/mm/dd?until=yyyy/mm/dd
  => rates for currency code XXX between given dates (inclusive), quoted
in default currency, sorted by date

My question is: how to I handle this in the routing file?

The options that I see open to me are to define custom actions in
currency_exchange_rates_controller.rb and add a routes.rb entry that
looks something like this:

...
  # see map.resources :forex
  map.resources :currency_exchange_rates
...
  map.forex '/forex/:currency_code/:year/:month/:day',
    :month        => nil,
    :day          => nil,
    :type         => 'CABK',
    :controller   => 'currency_exchange_rates',
    :action       => 'single_by_date',
    :requirements => { :currency_code => /[A-Z]{3}/i,
                       :year => /\d{4}/ }

  map.forex '/forex/:currency_code',
    :type         => 'CABK',
    :controller   => 'currency_exchange_rates',
    :action       => 'single',
    :requirements => { :currency_code => /[A-Z]{3}/i }

  map.forex '/forex/:year/:month/:day',
    :month        => nil,
    :day          => nil,
    :type         => 'CABK',
    :controller   => 'currency_exchange_rates',
    :action       => 'by_date',
    :requirements => { :currency_code => /[A-Z]{3}/i,
                       :year => /\d{4}/ }

  map.resources :forex,
    :type         => 'CABK',
    :controller   => 'currency_exchange_rates',
    :only         => [:index, :show]
...

Or, I can change the :action => key to another argument key, say :method
=>, and then parse the params hash for its value inside the index method
of the controller.  I can see arguments for and against both approaches
and the only thing that I have to guide me is that the former approach,
:action =>, seems to be more in keeping with the spirit of "tell, don't
ask" as outlined here:

http://www.pragprog.com/articles/tell-dont-ask

In either case, the action/method in the controller is simply going to
call the same named method in the currency_exchange_model, passing the
params hash as the argument, and return the resulting collection to the
index view.

Thoughts?
This topic is locked and can not be replied to.