Drop down without a model

You said at the top that there is no model to get the values from, so how can there be a saved value in the db?

Colin

Assuming that you have form_for @some_object do |f| where @some_object is the object being edited and that @some_object.year_made contains the previous selection then the dropdown should default to the current selection, I think.

Colin

Well with this code,

<%= f.select(:year_made, ((1980..Time.now.year).collect {|p| [ p, p ]}).reverse, {:prompt=>"Select a Year"}) %>

it does not seem to work and that makes me wonder what is wrong with this code?

What does the form_for line look like? What does generated html of the select look like? (View, Page Source or similar in your browser) Have you checked that year_made contains the previous value. Possibly put <%= @object.year_made %> in the form to check.

Colin

Odd, it all looks ok to me. Is year_made an integer or a string? I wonder whether it is expecting an integer as all my uses have always been with an id value.

Any other ideas anyone?

Colin

Well it turns out that it was a string vs integer issue. I have my fields in db as string and the code was generating a integer so that caused issues at edit time.

I made the following change and now it seems to work.

<%= f.select(:year_made, ((1980..Time.now.year).collect {|p| [ p.to_s, p.to_s ]}).reverse, {:prompt=>"Select a Year"}) %>

Does anyone else have a better idea on how to do this?

No. This is the right way to do it. Data type matches are necessary for functionality, you can't ignore those.

Well it turns out that it was a string vs integer issue. I have my fields in db as string and the code was generating a integer so that caused issues at edit time.

I made the following change and now it seems to work.

<%= f.select(:year_made, ((1980..Time.now.year).collect {|p| [ p.to_s, p.to_s ]}).reverse, {:prompt=>"Select a Year"}) %>

Does anyone else have a better idea on how to do this?

You probably only need the to_s on one of them not both.

Presumably it would also work if, instead, the type of year_made were changed to integer. Arguably this might be a more aesthetically pleasing solution.

Colin

I agree with you on that. And will think about converting to integer, I do have two more drop downs with similar values but they do have one or more string values so they do require to be strings but the year_made does not.

Hi,

What essentially you are doing here is creating an array. So you can prepend “Local” in the array like this

((1980…Time.now.year).collect {|p| [p.to_s, p.to_s ]}).reverse.unshift “Local”

I will also suggest you move out this array creation, and put it as a helper method.