# ROXML from\_xml not returning an object instance

**URL:** <https://www.ruby-forum.com/t/roxml-from-xml-not-returning-an-object-instance/159350>\
**Category:** Rails\
**Created:** [February 3, 2009, 7:40pm UTC](https://www.ruby-forum.com/t/roxml-from-xml-not-returning-an-object-instance/159350 "2009-02-03T19:40:29Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![adamfowleruk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e99b99/32.png) [@adamfowleruk](https://www.ruby-forum.com/u/adamfowleruk)\
**Post date:** [February 3, 2009, 7:40pm UTC](https://www.ruby-forum.com/t/roxml-from-xml-not-returning-an-object-instance/159350/1 "2009-02-03T19:40:29Z")

</div>

Hello,

I have two ActiveRecord classes. One is Route the other is Waypoints.  
I have constructed an XML representation so I can use AJAX to create a  
Route with all waypoints in a single create call to RouteController.  
When I call Route.from\_xml(xmlString) it is not returning an object -  
it’s leaving the object (@route) nil, but not erroring. Any ideas?  
Here’s some code:

RoutesController:

def create  
@route = nil;  
if params[:requestXML]

```
  # unserialise from XML using ROXML
  @route = Route.from_xml(params[:requestXML]);

else
  @route = Route.new(params[:route])
end

respond_to do |format|

 #The following line unsurprisingly fails, as @route is nil
  if @route.save

    flash[:notice] = 'Route was successfully created.'
    format.html { redirect_to(@route) }
    format.xml { render :xml => @route, :status

```

=\> :created, :location =\> @route }  
format.js  
else  
format.html { render :action =\> “new” }  
format.xml { render :xml =\> @route.errors, :status  
=\> :unprocessable\_entity }  
end  
end  
end

Route.rb:

class Route \< ActiveRecord::Base  
include ROXML

has\_many :waypoints

xml\_reader :title  
xml\_reader :totalDist  
xml\_reader :totalMis  
xml\_reader :totalHg  
xml\_reader :lonlatx  
xml\_reader :lonlaty  
xml\_reader :grcenter

xml\_accessor :waypoints, [Waypoint], :in =\> “waypoints”  
end

Waypoint.rb:

class Waypoint \< ActiveRecord::Base  
include ROXML

belongs\_to :route

xml\_reader :isLeg  
xml\_reader :lonlatx  
xml\_reader :lonlaty  
xml\_reader :gridReference  
xml\_reader :ascent  
xml\_reader :descent  
xml\_reader :distance  
xml\_reader :bearing  
xml\_reader :timemins  
end

NB I’ve not specified types at the moment for the above elements. I’m  
just trying to verify that the XML is being parsed by ROXML’s from\_xml  
method.

Error Message in logs:

Processing RoutesController#create (for 127.0.0.1 at 2009-02-03  
16:36:12) [POST]  
Session ID:  
BAh7DToMY3NyZl9pZCIlZWY5NWRjODFjMTI5ZDg3ZDlhZGRjODM0ODA3NmZl  
YTE6DW5hdnN0YWNrWwYiBi86DnJldHVybl90byIaL2FkYW1mb3dsZXIvZGFz  
aGJvYXJkOhBsYXN0X2FjdGl2ZVU6IEFjdGl2ZVN1cHBvcnQ6OlRpbWVXaXRo  
Wm9uZVsISXU6CVRpbWUNb0MbgAAAwMEGOh9AbWFyc2hhbF93aXRoX3V0Y19j  
b2VyY2lvblQiCFVUQ0AMOgl1c2VyaRM6C2ZvcnVtc3sAOgt0b3BpY3NADiIK  
Zmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsG  
Ogtub3RpY2UiJFJvdXRlIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4GOgpA  
dXNlZHsGOxBU–48a6d44f6baa5129fd1160815273a9c30ca746a8  
Parameters: {“requestXML”=\>“11185.321521477119\</  
totalDist\>640235.75000000000003\</  
totalMins\>357865271635\</  
lonlaty\>SH 71635 57865\</  
grcenter\>false357290\</  
lonlatx\>271650SH 71650 57290\</  
gridReference\>812200\</  
distance\>0false\</  
isLeg\>357260274600\</  
lonlaty\>SH 74600 57260275\</  
ascent\>482950.152538429157\</  
distance\>91false\</  
isLeg\>359160273330\</  
lonlaty\>SH 73330 5916073\</  
ascent\>1702285.3664913969487\</  
distance\>326false\</  
isLeg\>359170270050\</  
lonlaty\>SH 70050 59170182\</  
ascent\>1723280.015243867016\</  
distance\>270false\</  
isLeg\>357470269740\</  
lonlaty\>SH 69740 5747029\</  
ascent\>1071728.0335644888382\</  
distance\>190false\</  
isLeg\>356840270440\</  
lonlaty\>SH 70440 56840640\</  
ascent\>717941.7536832951597\</  
distance\>132”,  
“authenticity\_token”=\>“a538a4ed8056e17ded2904abfb00628ff6594a07”,  
“action”=\>“create”, “controller”=\>“routes”}  
[globalite] loading locale: en-US from config  
[globalite] Locale set to en-US  
[globalite] loading locale: en-US from config  
[globalite] Locale set to en-US

NoMethodError (You have a nil object when you didn’t expect it!  
You might have expected an instance of Array.  
The error occurred while evaluating nil.delete):  
/Library/Ruby/Gems/1.8/gems/activerecord-2.1.2/lib/active\_record/  
transactions.rb:124:in `rollback_active_record_state!' /Library/Ruby/Gems/1.8/gems/activerecord-2.1.2/lib/active_record/ transactions.rb:106:in`save’  
/app/controllers/routes\_controller.rb:52:in `create' /Library/Ruby/Gems/1.8/gems/actionpack-2.1.2/lib/action_controller/ mime_responds.rb:106:in`call’  
/Library/Ruby/Gems/1.8/gems/actionpack-2.1.2/lib/action\_controller/  
mime\_responds.rb:106:in `respond_to' /app/controllers/routes_controller.rb:51:in`create’  
…

Thanks,

Adam.

---

<div class="post-metadata">

**Author:** ![adamfowleruk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e99b99/32.png) [@adamfowleruk](https://www.ruby-forum.com/u/adamfowleruk)\
**Post date:** [February 4, 2009, 6:33pm UTC](https://www.ruby-forum.com/t/roxml-from-xml-not-returning-an-object-instance/159350/2 "2009-02-04T18:33:35Z")

</div>

Hey Adam,

I’ll take a look at this later today and get back to you. I  
specifically haven’t tested intermixing ROXMl and ActiveRecord (as you  
have with :waypoints). I suspect the problem is that I’m setting the  
instance variable rather than going through the proxy accessor. I’ll  
post here again when I have that worked out.

Or, if you’re so inclined, you can dig into the code yourself. See the  
“instance\_variable\_set” line, line 586 here:

> <https://github.com/Empact/roxml/blob/c9a3d82827d6939fcc76fa354a52f8bc357ba169/lib/roxml.rb>

---

<div class="post-metadata">

**Author:** ![adamfowleruk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e99b99/32.png) [@adamfowleruk](https://www.ruby-forum.com/u/adamfowleruk)\
**Post date:** [February 5, 2009, 10:33am UTC](https://www.ruby-forum.com/t/roxml-from-xml-not-returning-an-object-instance/159350/3 "2009-02-05T10:33:10Z")

</div>

Alright, the problem seems to be that ROXML uses the Object#allocate  
to generate objects, and never calls #initialize on those objects,  
owing to the fact that you would want to initialize differently in a  
world where your attributes are already initialized than in one where  
they are not (which is the base #new case). There’s a workaround  
though, which I haven’t tested but which will definitely solve the  
immediate problem. That is to implement the #xml\_initialize method on  
your objects, and in it, call the regular #initialize, like so:

class RoxmlClass \< ActiveRecord::Base  
include ROXML  
def self.xml\_initialize  
initialize  
end  
end

#xml\_initialize ([http://roxml.rubyforge.org/rdoc/classes/ROXML/](http://roxml.rubyforge.org/rdoc/classes/ROXML/)  
InstanceMethods/Construction.html#M000010) is called at the end of  
#from\_xml, and can be used to do things like call initialize with the  
data from your xml attributes, or whatever else.

Hope that helps, and I’ll have something which handles this in a  
general way out in the near future. Feel free to contact me directly  
in the future. You’ll find my email on the website:  
[http://empact.github.com/roxml/](http://empact.github.com/roxml/)

On Feb 4, 9:33 am, Ben W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![adamfowleruk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e99b99/32.png) [@adamfowleruk](https://www.ruby-forum.com/u/adamfowleruk)\
**Post date:** [February 12, 2009, 3:22pm UTC](https://www.ruby-forum.com/t/roxml-from-xml-not-returning-an-object-instance/159350/4 "2009-02-12T15:22:16Z")

</div>

Alright, I found that this actually required a bit more to work  
properly, but if you look at my latest code:  
[GitHub - Empact/roxml: ROXML is a module for binding Ruby classes to XML. It supports custom mapping and bidirectional marshalling between Ruby and XML using annotation-style class methods, via Nokogiri or LibXML.](http://github.com/Empact/roxml/tree/master),  
I have a examples/active\_record.rb, and spec/examples/active\_record.rb  
to show it’s working properly.

So install this latest version from my github and you should have  
things working. See the history:

> <https://github.com/Empact/roxml/blob/a2434d5c14a31ec2099c38a6248b4fcf4e5f5565/History.txt>

for the changes involved.

You should also get some deprecation warnings from this newest code.  
I’m preparing for a bit of an API shakeup in 3.0 which should be the  
last. In short, all type declaration come via the :as parameter, all  
location declarations come via :from and :in, all options come as  
separate arguments. The rdocs should be up to date on this.
