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?
-
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.
-
you could do something like
select "foo", "bar", @hash_objector
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
-
Hash.each |a|returns an array of the forma = [key, value], so for the hash@status_fieldsyou 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) %>Neil Middleton : So, How would I then tell it the selected value - this doesn't appear to pick it up.Schrockwell : 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. -
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
0 comments:
Post a Comment