# table has quiz_id, text, created_at, updated_at
belongs_to :quiz
has_many :options
validates_presence_of :text
validates_length_of :text, :within => 3..255
def to_s
text
end
end
in my tests, everything works fine. In my view, I have
<%= @question %>
which yields "ActionView::TemplateError (undefined method `to_s' for
#<Question:0x32c8d84>)"
Interestingly,
<%= @question.text %> yields the appropriate text.
<%= @question.text %> yields "Question"
<%= @question.inspect %> yields values for the fields text,
created_at, and updated_at.
@question.options and @question.quiz both yield the same error as
@question.to_s
# table has quiz_id, text, created_at, updated_at
belongs_to :quiz
has_many :options
validates_presence_of :text
validates_length_of :text, :within => 3..255
def to_s
text
end
end
in my tests, everything works fine. In my view, I have
<%= @question %>
which yields "ActionView::TemplateError (undefined method `to_s' for
#<Question:0x32c8d84>)"
Interestingly,
<%= @question.text %> yields the appropriate text.
<%= @question.text %> yields "Question"
<%= @question.inspect %> yields values for the fields text,
created_at, and updated_at.
@question.options and @question.quiz both yield the same error as
@question.to_s
Anybody have any idea why this is happening?
My first guess would be that it's because to_s is valid on object attributes, not on a "complex" object. While you haven't shown it, you imply that you're trying to use it on a 'complex" object (e.g., @question.to_s). If @questions.object and @questions.quiz would also yield objects, rather than object attributes, then I'd start there.
Except . . . to_s is explicitly defined to return text. Changing that
to return read_attribute(:text) makes no difference. Nor does
changing the database column to "q_text" or something else that can't
be interpreted as a keyword.
As an added complication, let's say I have two quizzes in the
database, Quiz1 and Quiz2. If I load up Quiz1 first, and try to look
at it's question1, I get the method not defined error. If I then load
up Quiz2 and try to find its question49, it doesn't exist.
Now, here's the really weird thing... if I flush the database and
restart the server (which re-inserts the same defaults: Quiz1 and
Quiz2), then load Quiz2 first, that one gets the error on question49,
and question1 for quiz1 doesn't exist!
the quizzes that were being autocreated on startup weren't valid. Why
they didn't throw an exception I don't know. Why they still loaded
into memory I don't know (except that validations probably aren't run
on retrieval). But why on Earth did this prevent the associated
objects from loading properly??? I have absolutely no clue.