Default values and text_field

I have a model and I set defaults for some values by overriding the
read accessor. For example

def heading
read_attribute(:heading).nil? ? ‘Please select from:’ :
read_attribute(:heading)
end

The problem I have found is that text_field ignores this.

<%= f.text_field :heading %>

is empty even when heading is nil

now I can easily add :value and it works

<%= f.text_field :heading,  :value => @site.heading %>

but it seems like this shouldn’t be necessary. I also override read
accessors for values that I use in select statements on the same form
and it works fine.

def text_color
read_attribute(:text_color).nil? ? SiteColors::TEXT_DEFAULT :
read_attribute(:text_color)
end

<%= f.select :text_color, SiteColors::COLORS%>

This picks up the default fine

Is this a bug in text_field or am I just doing something stupid?

Tony

On Feb 11, 1:37pm, Tony P. [email protected] wrote:

I have a model and I set defaults for some values by overriding the
read accessor. For example

def heading
read_attribute(:heading).nil? ? ‘Please select from:’ :
read_attribute(:heading)
end

Have you double checked this works by calling heading directly on the
object in question?

Fred

On Feb 11, 8:45am, Frederick C. [email protected]
wrote:

Have you double checked this works by calling heading directly on the
object in question?

yes.

This works

<%= f.text_field :heading, :value => @site.heading %>

and if I set it in the controller it works fine too.

@site.heading = ‘testing’

Maybe text_field is using read_attribute instead of calling the
method?

The string is nil. I even created a new rails project to test this
out.

(Rails 3 / 1.9.2)

rails generate scaffold test value1:string value2:integer

app/models/test.rb
class Test < ActiveRecord::Base
def value1
read_attribute(:value1).nil? ? ‘hello’ : read_attribute(:value1)
end
def value2
read_attribute(:value2).nil? ? 3 : read_attribute(:value2)
end
end

app/views/tests/_form.html.erb
<%= form_for(@test) do |f| %>
value 1 is <%= @test.value1.inspect %> and value 2 is <%=
@test.value2.inspect %>

<%= f.label :value1 %>
<%= f.text_field :value1 %>
<%= f.label :value2 %>
<%= f.select :value2, (1..10) %>
<%= f.submit %>
<% end %>

At the top of the form we see
value 1 is “hello” and value 2 is 3

the select statement has 3 selected but the text field has nothing.

Adding ‘:value => @test.value1’ fixes the issue but shouldn’t be
necessary AFAIK
<%= f.text_field :value1, :value => @test.value1 %>

Sorry, I can’t help you out as I’m not on my dev box. One thing off the
top
of my mind (so you wont have to worry about that) is to use a
placeholder
attribute instead of doing that check. Good luck!

On Fri, Feb 11, 2011 at 11:57 PM, Tony P.
[email protected]wrote:

read_attribute(:value1).nil? ? ‘hello’ : read_attribute(:value1)

<% end %>

end
and if I set it in the controller it works fine too.
<%= f.text_field :heading %>
form

To unsubscribe from this group, send email to
“Ruby on Rails: Talk” group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.

are you sure that heading is nil? could you double check if it’s not an
empty string?

On Fri, Feb 11, 2011 at 9:50 PM, Tony P.
[email protected]wrote:

read_attribute(:heading).nil? ? 'Please select from:' :

read_attribute(:text_color)