Forum: Ruby on Rails select in form - best practice?

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 2008-11-05 21:31
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?
Frederick C. (Guest)
on 2008-11-05 21:46
(Received via mailing list)
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
James B. (Guest)
on 2008-11-05 22:02
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?
AndyV (Guest)
on 2008-11-05 22:44
(Received via mailing list)
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>
Roy P. (Guest)
on 2008-11-06 19:14
(Received via mailing list)
I think Fred's given the preferred idiom.  It's simple & it works.
This topic is locked and can not be replied to.