select in form - best practice?

Q. What resource do readers recommend for referencing regarding best
practices for form construction in Rails?

I have the following situation: location_type of Locations may have one
of five (5) possible codes. Presently I have these codes listed in a
drop-down select constructed thusly:

  <p>
    <b>Location type</b><br />
      <%= f.select :location_type,
        [
          ['MAIN - Main Address', 'MAIN'],
          ['POST - Postal Delivery', 'POST'],
          ['DELV - Package Delivery', 'DELV'],
          ['SHIP - Package Shipping', 'SHIP'],
          ['OTHR - Other', 'OTHR'],
        ],
             :selected => 'MAIN',
             :size => 4
      -%>
  </p>

Should this instead be constructed so that the model, Locations, has
these virtual attributes:

    valid_location_type[]=
      [
        ['MAIN - Main Location','MAIN'],
        ['POST - Postal Delivery', 'POST'],
      ...
      ]

    default_location_type = 'MAIN'

and then the view could have this instead:

      <%= f.select :location_type,
                    @location.valid_location_type,
                    :selected => @location.default_location_type,
                    :size => 4

Would this even work?

Comments?

Should this instead be constructed so that the model, Locations, has
these virtual attributes:

valid\_location\_type\[\]=
  \[
    \[&#39;MAIN \- Main Location&#39;,&#39;MAIN&#39;\],
    \[&#39;POST \- Postal Delivery&#39;, &#39;POST&#39;\],
  \.\.\.
  \]

default\_location\_type = &#39;MAIN&#39;

Personally I would have it as a constant of the Location class, ie

class Location ...
  VALID_TYPES = [...]
end

Fred

Frederick Cheung wrote:

� � default_location_type = 'MAIN'

Personally I would have it as a constant of the Location class, ie

class Location ...
  VALID_TYPES = [...]
end

Fred

Point taken.

Nonetheless, in the interim I have tested it and this does indeed work
as expected. However, I used private methods and public getters to
implement.

  def valid_location_type
    virt_valid_type
  end

private

  def virt_valid_type
    vvt =
      [
        ['MAIN - Main Address', 'MAIN'],
        ['POST - Postal Delivery', 'POST'],
        ['DELV - Package Delivery', 'DELV'],
        ['SHIP - Package Shipping', 'SHIP'],
        ['OTHR - Other', 'OTHR']
      ]
  end

But my question remains: Is this the preferred idiom or is there
another recommended way to do this?

Looks like a good place to give this a spin:
http://railscasts.com/episodes/121-non-active-record-model

Basically, use a pure-ruby class to wrap the location types and let it
support an ActiveRecord like interface (mainly find and all). Then
you can do collection_select the way you would with a normal ARec
model.

Depending on which version of Rails you're working with you may also
check into PassiveRecord. It's a pretty advanced version of the same
concept. Unfortunately it has dependencies on older versions of ARec.

I think Fred's given the preferred idiom. It's simple & it works.