Ruby on Rails: combobox is showing id and not the name - ruby-on-rails

I got the code
<%= f.select :wahl1, options_for_select(#berufs) %>
and im getting id´s or smth #<Beruf:0x45ed8e8> instead of the name of #berufs in the combobox

options_for_select expects a simple array or hash of keys and values. Yet you are passing it a collection of models.
What you want is options_from_collection_for_select, for example:
= f.select :wahl1, options_from_collection_for_select(#berufs, 'id', 'name')

Related

options_from_collection_for_select doesnt accept hash as argument

I have a select_tag with an options_from_collection_for_select that looks like this :
<%= select_tag "dash_select", options_from_collection_for_select(session[:user_hotel_list], "id", "name") %>
My variable session[:user_hotel_list] is a collection of hashes that looks something like this :
[{"id"=>31, "name"=>"Plaze", "contact_mail"=>"plaze#gmail.com", "contact_phone"=>"+33666027414", "address"=>"JDJDJ", "postcode"=>"92200", "city"=>"JDJDJ", "nb_room"=>nil, "created_at"=>"2016-02-26T12:12:39.214Z", "updated_at"=>"2016-02-26T12:12:39.214Z", "auditor_id"=>nil, "account_id"=>48}, {"id"=>30, "name"=>"dndjd", "contact_mail"=>"djdj#gmail.com", "contact_phone"=>"+33666027414", "address"=>"k", "postcode"=>"92200", "city"=>"kk", "nb_room"=>nil, "created_at"=>"2016-02-25T22:27:47.035Z", "updated_at"=>"2016-02-25T22:27:47.035Z", "auditor_id"=>nil, "account_id"=>48}]
Unfortunately I get undefined methodname' for #`
How can I convert my object to a structure that is accepted by rails options_from_collection_for_select?
You can use options_for_select and #collect to make this a bit easier.
<%= select_tag "dash_select", options_for_select(session[:user_hotel_list].collect{|h| [h['name'], h['id']]}) %>
That should get you what you are looking for and hopefully save you some time!
Answer was taken from How to populate a select_tag with an array of hashes?.

Why select_tag displays only one column?

I have the following select_tag in my view:
<%= select_tag :users, options_from_collection_for_select(#users, 'id','firstname' , 'lastname') %></p></br>
I want to display the firstname and lastname in the select_tag, but it always displays the first parameter after the 'id' in this case the firstname.
What I'm doing wrong?
Use this instead
<%= select(:users, :id, #users.map {|u| [u.firstname + " " + u.lastname,u.id]}) %>
Im confident that options_for_select only allows you to put 1) The value that you want each option to have, 2) The id or label you want that option to have.
What you'd do is, in your User model, set a method to concatenate both the user first and last name into one and then use that as your option_for_select id.
User Model
def userFullName
self.firstname+' '+self.lastname
end
Then use it in your select_tag as this:
<%= select_tag :users, options_from_collection_for_select(#users, 'id','userFullName') %>
From Api Doc for options_from_collection_for_select you can get this:
options_from_collection_for_select(collection, value_method, text_method, selected = nil)
If you only want to display the options, that's is the right way to do it.
You only specify a 4th parameter if you want to preselect one option.
If you want to concatenate the name, you could do it as Oscar Valdez is telling you to.
Check more info for options_from_collection_for_select here: http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select

How can I allow NULL values in a drop down list using Ruby on Rails?

Suppose I had a dropdown list in my form that allows users to select their favorite hot drink.
<%= form_for #person do |f| %>
<%= f.select :hot_drink, [['Tea', 'tea'], ['Coffee', 'Coffee']]
...
I want users to able to enter a NULL value if they don't like hot drinks. Something like this:
<%= f.select :hot_drink, [['Nothing Selected', NULL], ['Tea', 'tea'], ['Coffee', 'coffee']]
I know about the :include_blank option, but it's not what I'm looking for because it inserts an empty string into the database, which is not the same as a NULL. There are many NULL values already in my database, and I use this form for inserting and editing the Person's records. I need the dropdown list to recognize NULLs so I can edit the other fields in Person without being forced to change the value of hot_drink.
Anyone know how I could go about this?
Have you tried
<%= f.select :hot_drink, [['Nothing Selected', nil], ['Tea', 'tea'], ['Coffee', 'coffee']] %>
Try to add a default value to nil in your migration to handle this case.

How do I obtain a selected value in Ruby on Rails 2.3.8?

My select_tag is as follows.
<%= select_tag "group", options_from_collection_for_select(#groups, "id", "gname") %>
How do I obtain the selected value in my controller?
Use square brackets.
select_tag "group[]", options_for ....
Note the []. Rails will then store this as {"group" => [one option for each form]}.
If it's important to know which select provided which value, you can nest them, so
select_tag "group[bob]", ...
will provide {"group" => {"bob" => selected_option}}.
Basically, [] stores it in an array, and [key] stores it in a hash with that key.
Then in controller, you can use as:
params["group"], which should be an array of the various selects on the page.
Try puts params and check the your console to see values sent to the controller.
That should be params[:group] in your controller.

Array as Parameter from Rails Select Helper

I'm working on a legacy project that is using acts_as_taggable_on which expects tags to come in arrays. I have a select box allowing users to select a tag on a Course in a field called categories. The only way mass assignment create will work is if params looks like this params = {:course => {:categories => ['Presentation']}}. I've currently a view with this helper:
<%= f.select 'categories', ['Presentation' , 'Round Table' , 'Demo', 'Hands-on'] %>
Which will give me a parameter like params = {:course => {:categories => 'Presentation'}}. This doesn't work since Acts as tag gable apparently can't handle being passed anything other than a collection.
I've tried changing categories to categories[] but then I get this error:
undefined method `categories[]' for #<Course:0x007f9d95c5b810>
Does anyone know the correct way to format my select tag to return an array to the controller? I'm using Rails 3.2.3
I didn't work with acts_as_taggable_on, but maybe this simple hack will be suitable for you? You should put it before mass-assignment.
category = params[:course][:categories]
params[:course][:categories] = [category]
If you are only going to allow the selection of ONE tag, you could do:
<%= f.select 'categories', [['Presentation'] , ['Round Table'] , ['Demo'], ['Hands-on']] %>
Each one item array will have first for the display value, and last for the return value, which in this case will both return the same thing, as the first element of the array is the same as the last element when the array as one element.
Seems like select doesn't give you that option.
If I understand correctly, one option might be to use a select_tag instead and just be explicit about where you want the selection in the params:
<%= select_tag 'course[categories][]', options_for_select(['Presentation' , 'Round Table' , 'Demo', 'Hands-on']) %>
That ought to get your params the way you need them.
Here's what I'm using for one of my projects:
<% options = { include_blank: true } %>
<% html_options = { required: true, name: "#{f.object_name}[#{resource.id}][days][]" } %>
<%= f.select :days, DAYS, options, html_options %>
Without html_options[:name], Rails handles the name of the select tag and spits out something like
service[service_add_ons_attributes][11][days]
but I need
service[service_add_ons_attributes][11][days][]
So I override it.
Hope that helps.

Resources