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:

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.