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?