Radio_button_tag for every value of constant array

How do I create a radio_button_tag for every value of a constant
array? E.g., I have this constant array: VALID_ORIENTATIONS =
[“Straight”, “Gay”, “Bisexual”] . A user is presented with a form to
search for other users according to sexual orientation. Currently,
the form looks like this:

Sexual Orientation: <%= radio_button_tag :orientation, "Straight", params[:orientation] == 'Straight', :id => "Straight" %>Straight <%= radio_button_tag :orientation, "Gay", params[:orientation] == 'Gay', :id => "Gay" %>Gay <%= radio_button_tag :orientation, "Bisexual", params[:orientation] == 'Bisexual', :id => "Bisexual" %>Bisexual <%= radio_button_tag :orientation, "", params[:orientation].blank?, :id => "Any" %>Any

This is not DRY. How can I iterate through every value in the
constant array to make these radio buttons? Is partial appropriate
for this? The array has only three values.

Also: the blank in the last radio button is obviously not in the
array. It’s there to allow the user to not use this search
criterion. Is there a better way for a user to unselect a radio
button without choosing any other?

Thanks.

Learn by Doing wrote:

How do I create a radio_button_tag for every value of a constant
array? E.g., I have this constant array: VALID_ORIENTATIONS =
[“Straight”, “Gay”, “Bisexual”] . A user is presented with a form to
search for other users according to sexual orientation. Currently,
the form looks like this:

Sexual Orientation: <%= radio_button_tag :orientation, "Straight", params[:orientation] == 'Straight', :id => "Straight" %>Straight <%= radio_button_tag :orientation, "Gay", params[:orientation] == 'Gay', :id => "Gay" %>Gay <%= radio_button_tag :orientation, "Bisexual", params[:orientation] == 'Bisexual', :id => "Bisexual" %>Bisexual <%= radio_button_tag :orientation, "", params[:orientation].blank?, :id => "Any" %>Any

This is not DRY. How can I iterate through every value in the
constant array to make these radio buttons? Is partial appropriate
for this? The array has only three values.

You used the word “iterate” to describe what you want to do. Does that
ring any bells? Right! Use Array#each or render :partial, :collection.

Also: consider using the array indices, not the actual words, for the
value attributes of the buttons.

BTW, why aren’t you using Haml?

Also: the blank in the last radio button is obviously not in the
array. It’s there to allow the user to not use this search
criterion. Is there a better way for a user to unselect a radio
button without choosing any other?

No. Use a element instead (and check out collection_select).

Thanks.

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Thanks Marnen. Using the array index and partial is a great idea.
The select and collection_select are also promising.

I’ll take a look at Haml.

Thanks.

Learn by Doing wrote:

Hi Marnen,

The select and collection_select require an instance variable to be
passed to the view. But I am using form_tag and not form_for. So I
don’t have an object to work with.

So use select_tag.

This is a search form, the user
does not need to log in. So does it make sense to switch to
“form_for” for this search form in order to have an object to work
with?

Usually, yes. Do you have a Search class?

Thanks.

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Hi Marnen,

Thank you so much for pointing me to using a Search class. I watched
the screencast on this
http://media.railscasts.com/videos/111_advanced_search_form.mov
and realized this is what I should do so that the app can remember a
user’s search.

My question now is How do I store the value of multiple checkboxes as
a result of using
“check_box” helper in a “Search” class? Please see my thread on this
question here:
http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/50915dfb233d62bc#

BTW, yes I should have looked at select_tag more closely.

Thanks!

Hi Marnen,

The select and collection_select require an instance variable to be
passed to the view. But I am using form_tag and not form_for. So I
don’t have an object to work with. This is a search form, the user
does not need to log in. So does it make sense to switch to
“form_for” for this search form in order to have an object to work
with?

Thanks.