Creating/Updating Models from text/xml Requests

I'm curious how others would deal with this situation.

In my case, I have:

class Package   has_many :deliveries end

class Delivery   belongs_to :package   belongs_to :region end

class Region   has_many :deliveries end

And accept XML requests in the following manner:

<package>   <name>Good Shipment<name>   <!-- snip other fields -->   <deliveries>     <delivery>       <status>Failure</status>       <region>   <name>US</name>       </region>     </delivery>     <delivery>       <status>Unknown</status>       <region>   <name>FR</name>       </region>     </delivery>   </deliveries> </package>

Now, my controller would look something like this ugly beast:

class PackagesController   def create     if package = params[:package]       package = Package.find_or_initialize_by_name(package)       if deliveries = package.delete(:deliveries)          deliveries.each do |d|              region = d.delete(:region)              region = Region.find_or_create_by_name(region[:name])              break if region.nil?              package.deliveries.create(region)              package.deliveries[-1].region = region          end       end     end     #save and more...   end end

As one can see, this is horrible for several reasons. One of the big ones being request validation and error handling.

Overriding package.from_xml is an option, but I find myself thinking that I should be validating against request.body with say a DTD, as opposed to picking apart the params hash. (Though I'll have to pick it apart anyways to create the models...)

Then I find my self thinking that creating a course grained validation method like a DTD is stupid since I have my fine grain validation logic within the given models.

Yes, I've heard of ROXML.

Any thoughts?

MaggotChild wrote:

And accept XML requests in the following manner:

<package>   <name>Good Shipment<name>   <!-- snip other fields -->   <deliveries>     <delivery>       <status>Failure</status>       <region>

If you try this from_xml...

   75525’s gists · GitHub

...I think it would clear the make-work out of the way, allowing you to focus on the validations. Tell me if you get stuck - I wrote it for your exact situation, but it can't validate automatically.