Select in form - best practice?


#1

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:

Location type
<%= 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 -%>

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?


#2

On Nov 5, 7:31 pm, James B. removed_email_address@domain.invalid
wrote:

default_location_type = 'MAIN'

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

class Location …
VALID_TYPES = […]
end

Fred


#3

Frederick C. wrote:

On Nov 5, 7:31�pm, James B. removed_email_address@domain.invalid
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?


#4

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.

On Nov 5, 3:02 pm, James B. removed_email_address@domain.invalid


#5

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