Confused about to_xml() in ActiveRecord::Base subclass

Since all my efforts to control how to_xml() is formatting dates has failed, I'm now considering writing my own to_xml(). However, from the limited examples I've found, I just don't understand how to actually reference the columns for the records in my record set.

Here's a simplified view of my ActiveRecord object:

class Errors < ActiveRecord::Base   set_table_name "legacy_errors"

  # legacy_errors has three columns: id, msg, error_date   # Since the default to_xml is generating error_dates in the format "Mon Nov 03 00:00:00 -0600 2008",   # and I cannot seem to force a different behavior, I want to create my own to_xml.

  # Examples online show the following as how to override to_xml:     def to_xml(options = {})       options[:indent] ||= 2       xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])       xml.instruct! unless options[:skip_instruct]       # v v v       xml.level_one do         xml.tag!(:second_level, 'content')       end       # ^ ^ ^     end end

The code between the v and ^ markers is where the body of each XML object is generated. If I were generating by hand, I would do something like this: errors.each do |err|   s << "<id>" << err.id << "</id>"   s << "<msg>" << err.msg << "</msg>"   s << "<error_date>" << err.error_date.strftime("%Y-%m-%d") << "</ error_date>" end

I'm not at all understanding how to do my thing within the v ^ section of to_xml().

Any help is appreciated!

Thanks.

that should be the encoding of a single Errors instance.

   xml.error do |x|      x.id(self.id)      x.msg(self.msg)      x.error_date(self.error_date.strftime('%Y-%m-%d'))    end

I think that you'd get a bunch of errors with:

   Errors.find(:all, :conditions => [...]).to_xml(:root => 'errors')

By default, I get output of attributes like this:      <created-at type="datetime">2009-01-09T02:58:31Z</created-at>      <id type="integer">110</id>      <reference>From Anne</reference> When I do #to_xml. Notice the date format for the type="datetime". What is the actual class of error_date? Is it a Date or a DateTime or a Time?

-Rob

Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com

Rob,

Thanks much for the good response.

To answer your question about the data type, it's "date" in Oracle. When I use the default to_xml() (without suppressing types and the dasherizer) it looks like this: <error-date type=\"ActiveRecord::ConnectionAdapters::OracleColumn \">Wed Nov 12 00:00:00 -0600 2008</error-date>

In fact, every element is listed as "OracleColumn". I did try the following to control my date presentation:       proc = Proc.new {|options| options[:builder].tag! ('error_date_x', options[:object].error_date.strftime("%Y-%m-%d"))}       s = errs.to_xml(:dasherize => false, :skip_types => true, :procs => [proc]) That just blows up. NoMethodError: You have a nil object when you didn't expect it! The error occurred while evaluating nil.error_date

What's really odd is I've been using the default to_xml() for months and receiving "YYYY-MM-DD" as my format. Now suddenly I'm getting a different format. Perhaps I updated gems and got something new...

So now, if I cannot simply control the formatting of that one column, I'll do my own to_xml() (following your example).