I'm not sure if this would be considered a defect or not, so I wanted to post here before adding a report to Trac. Perhaps someone here is aware of something I'm not.
Let's say I have the following model classes defined:
### BEGIN ### class Foo < ActiveRecord::Base has_many :bars
def some_method "I am some_method" end end
class Bar < ActiveRecord::Base belongs_to :foo end ### END ###
If I try to run "Foo.find( 1 ).to_xml( :include => [ :bars ], :methods => [ :some_method ] )" there is a problem, because the options hash passed to Foo#to_xml is passed down to Bar#to_xml when it serializes the associated objects. In general, that's probably what you want -- the problem is that Bar#some_method is not defined, and so you get a NoMethodError when the serialization tries to call #some_method on the Bar instances.
I wonder if it would be a good idea to change the ActiveRecord::XmlSerialization::XmlSerializer#serializable_method_attributes method from
### BEGIN ### def serializable_method_attributes Array(options[:methods]).collect { |name| MethodAttribute.new(name.to_s, @record) } end ### END ###
to something like
### BEGIN ### def serializable_method_attributes valid_methods = Array(options[:methods]).reject { |name| !@record.respond_to? name } valid_methods.collect { |name| MethodAttribute.new(name.to_s, @record) } end ### END ###
Obviously, the danger here is that you do /not/ get an exception if you specify a method in the options that is not defined anywhere in the object graph being serialized. Personally, I think that would be a good trade-off. Otherwise I've found that I have to write a custom #to_xml method in many of my model classes just to remove unknown methods form the :methods option. Better to take care of that once at the root.
Thoughts?