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?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---