Newbie: Modifying blank option from 'collection_select'

Hi Peter -

I want to have a select combo-box on a page, and am using
"collection_select" to create it. I wanted to give the user a blank
option to choose from, and so found ":include_blank => true", which
works perfectly.

However: The blank entry does not have any text assigned to the option,
and so could be a little vague for the user, I would like to give this
blank option text like "(none)" or something similar. I am beginning to
believe I can't use collection_select to do this, but need to use
"select", is this the case? Perhaps someone would be kind enough to
point out the differences, and get me started.

Many thanks for helping out, it's much appeciated, and again, apologies
if this is a dumb question

Not a dumb question at all. I'm doing pretty much what you're doing in
my own app, and I did it this way:

<%= collection_select(:security_question, :id,
SecurityQuestion.find(:all), :id, :question, options ={:prompt =>
"(Select a question)"}, :class =>"security_question") %>

The trick is in this: options ={:prompt => "(Select a question)"}

That makes the first line of HTML spit out for the select look like
this:

<select class="security_question" id="security_question_id"
name="security_question[id]"><option value="">(Select a question)</

You can see that when the user loads the form, that select says
"(Select a question)", and that option has no value - so if it's left
that way when they submit the form, there'll be no value associated
with the ID of the select passed to your controller, so you can tell
they didn't choose anything.

Does that get you where you want to go?

Odd. You've just pointed out to me that I have a bug in my own code,
though it's not the same as what you're seeing. Instead, what I see
when I go to an edit form is that rather than what the user had
selected from that drop-down being the chosen option, the default
"(Select a question)" option is not only present, but selected. I'll
have to fix that, but I don't know how yet. If I figure this all out
I'll post back and let you know how I did it.

For something custom like this, you may just have to roll your own
using a helper like this:

`#pass in the name instead of true like, :include_blank => ‘Leave
Blank’

def collection_select_named_blank(object, method, collection,
value_method, text_method, options = {}, html_options = {})

sel_options =

options_from_collection_for_select(collection,value_method,text_method,object.send(value_method))

sel_options += '<option

value="">’+options[:include_blank]+’’ if
options.has_key? :include_blank

select_tag "#{object}[#{method}]", sel_options, html_options

end`

There is probably a better way to do this, but this is what I came up
with off the top of my head. I didn’t test the above code, so you will
need to. Hopefully this will send you in the correct direction.

Roger Pack wrote:

oops on the naming of the select tag

`

#pass in the name instead of true like, :include_blank => ‘Leave
Blank’

def collection_select_named_blank(object, method, collection,
value_method, text_method, options = {}, html_options = {})

sel_options =

options_from_collection_for_select(collection,value_method,text_method,object.send(value_method))

sel_options += '<option

value="">’+options[:include_blank]+’’ if
options.has_key? :include_blank

select_tag "#{object.class.humanize}[#{method}]", sel_options,

html_options

end`

William Pratt wrote:

I found this thread googling today. I see it's older, and there may be
other solutions by now, but I thought I'd use the opportunity to
document something that worked for me:

<%= form_builder_object.collection_select :my_model_id,
MyModel.all.insert(0, MyModel.new(:name => "None") ),
:id, :name %>

The trick is to make a new instance (which doesn't have an id yet), and
then insert that at the beginning of the collection. This makes the
text "None" show up first, thus be the default selection.