Drop down without a model

What is the best way to create a drop down where there is no backend
model to get the values from?

I am currently using:

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

but this gives me issues when I am trying to edit the info as the
currently saved value from the database is lost when edit action is
called.

2009/8/31 Quee Mm [email protected]:

currently saved value from the database is lost when edit action is
called.

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

Man i always post my questions wrong,

My dropdown will contain date range from 1980 to current year where as
the db will only contain the saved years say 2000.

2009/8/31 Quee Mm [email protected]:

Man i always post my questions wrong,

My dropdown will contain date range from 1980 to current year where as
the db will only contain the saved years say 2000.

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?

2009/8/31 Quee Mm [email protected]:

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

What does the form_for line look like?
<% form_for @vehicle do |f| %>

What does generated html of the select look like? (View, Page Source
or similar in your browser)

For New
http://pastie.org/600224

For Edit
http://pastie.org/600226

Have you checked that year_made contains the previous value. Possibly
put <%= @object.year_made %> in the form to check.
Yes it does.

2009/8/31 Quee Mm [email protected]:

For Edit
http://pastie.org/600226

Have you checked that year_made contains the previous value. Possibly
put <%= @object.year_made %> in the form to check.
Yes it does.

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

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

2009/9/2 Quee Mm [email protected]:

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

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?


Colin L. wrote:

2009/8/31 Quee Mm [email protected]:

For Edit
http://pastie.org/600226

Have you checked that year_made contains the previous value. Possibly
put <%= @object.year_made %> in the form to check.
Yes it does.

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

Back again with another question.

For the drop down below

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

I also want this to contain a value, “Local” as the first one in the
list. What is the best way to do this?

Quee Mm wrote:

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.

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.

अभिनव
http://twitter.com/abhinav