views:

472

answers:

4

I need to create a select box from the values available in a Hash.

For instance, I have a 'thing' and the 'thing' has a variety of status fields:

1 => 'State A'
2 => 'State B'

available via a method on thing.

How can I build a select tag from this?

+3  A: 

The select helper method will accept a hash in the form { text_displayed_in_select => select_value }, so you'll probably want to invert that hash.


Pesto
A: 

you could do something like

select "foo", "bar", @hash_object

or

select "foo", "bar", @hash_object.map { |h| [h.key, h.value] }

I'd probably invert your hash first to make the key point to the value

cpjolicoeur
A: 

Hash.each |a| returns an array of the form a = [key, value], so for the hash @status_fields you can write:

<%= collection_select('thing', 'status', @status_fields, :first, :last) %>

Alternatively, if you'd like the key to show up in the select list and the value point to the select list value, then:

<%= collection_select('thing', 'status', @status_fields, :last, :first) %>
Schrockwell
So, How would I then tell it the selected value - this doesn't appear to pick it up.
Neil Middleton
The documentation states that "The value returned from calling method on the instance object will be selected." So, instead of passing 'thing' as the first argument, try passing the actual instance of the object @thing.
Schrockwell
+1  A: 

Just as Schrockwell has said:

Hash.each |a| returns an array of the form a = [key, value], so for the hash @status_fields you can write:

<%= collection_select('thing', 'status', @status_fields, :first, :last) %>

Alternatively, if you'd like the key to show up in the select list and the value point to the select list value, then:

<%= collection_select('thing', 'status', @status_fields, :last, :first) %>

This will select the option given by thing.status or nothing if nil is returned

If you want to just create any selection not tied to an object use

<%= select_tag('name', options_from_collection_for_select(@status_fields, :first, :last, '2')) %>

where '2' is the index of the desired selection

PS: I don't have enough reputation to just amend the original post or comment on it

nasmorn