Very new to RoR, but having great fun so far. I have a question which I
thought would be a common one but haven't found a clear answer on the
forums through searching, so apologies:
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,
- Peter
--
Posted via http://www.ruby-forum.com/.
On May 31, 11:08 am, Peter Laurens <rails-mailing-l...@andreas-s.net>
wrote:
> 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)</
option>
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?
thanks for your advice, ":prompt" does indeed give the the ability to
name the 'nil value' as it were, which is exactly what was after,
thanks. But unfortunately, when an object does have something other than
nil for the field represented by the drop-down, the prompt disappears
(e.g. on edit screens etc.) - the result of this appears to be that once
a user has chosen an item from the list, they cannot 'un-choose' and go
back to nil for that field again :(
":include_blank" always rendered in the drop-down, and so allowed a user
to undo their selection in an edit at a later time. ":prompt" seems to
turn this into a one-way process :(
Have I missed something?
Many thanks,
On May 31, 1:15 pm, Peter Laurens <rails-mailing-l...@andreas-s.net>
wrote:
-- Sincerely, William Pratt
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]+'</option>' if options.has_key? :include_blank
select_tag "#{object.class.humanize}[#{method}]", sel_options, html_options
end
-- Sincerely, William Pratt
1. How can I set a default value in a collection_select? To be specific,
I have a class 'Platform', and I want to set the platform_code (a field
of Platform) to be 'ORA' (which exists in the Platform table).
I tried many variations of the following code in my view, but in vain:
<% @selected = 'ORA' %>
<%= collection_select "sac_table_platform", "platform_code",
Platform.find(:all, :order => "platform_code"),
:platform_code, :platform_code, { :selected => @selected } %>
2. How can I build my own list of collection_select, e.g., a list of
three people, say, to show [Adam, Bob, Charley] on the collection_select
for the corresponding values ['A', 'B', 'C'] in a table (which already
exists), and use it in my view?
Thanks,
Arif
>
> William Pratt wrote:
>> value="">'+options[:include_blank]+'</option>' if options.has_key?
>>> Anybody ever figure out know how to modify (well) the 'name' given the
>>>> nil for the field represented by the drop-down, the prompt disappears
>>>> Many thanks,
Thanks William! Also I think :prompt => 'whatever' might work for
certain tasks. Take care!
-Roger
<%= 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.