Confused about to_xml() in ActiveRecord::Base subclass


#1

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 << “” << err.id << “”
s << “” << err.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.


#2

On Jan 9, 2009, at 11:42 AM, michael_teter wrote:

legacy_errors has three columns: id, msg, error_date

 xml.instruct! unless options[:skip_instruct]

something like this:
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:
2009-01-09T02:58:31Z
110
From Anne
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 B. http://agileconsultingllc.com
removed_email_address@domain.invalid


#3

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

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).

On Jan 9, 11:20 am, Rob B. removed_email_address@domain.invalid