Neither from_xml nor from_Json work in rails 2.1


#1

If you have the need to do a lot of XML processing you are better off
staying away from rails completely. The State of SOAP on rails is a
mess to the point of being practically unusable. The XML and json
deserialization is like playing russian roulette with five bullets in
the chamber.

Try it yourself.

u = User.find(1).
xml = u.to_xml

… Change the xml.

u.from_xml(xml)

Doesn’t work.

Same with json. Doesn’t work.

Half the time from_xml can’t parse the xml to_xml put out.


#2

On Nov 27, 9:38 pm, “Tim U.” removed_email_address@domain.invalid wrote:

… Change the xml.

u.from_xml(xml)

Doesn’t work.

Same with json. Doesn’t work.

Minus your mysterious ‘change the xml’ that worked for me.If you could
produce a more precise example (or at least elaborate on “Doesn’t
work” (raises an exception, does nothing, has the wrong attributes,
something else…)
you might get a more helpful response.

Fred


#3

Minus your mysterious ‘change the xml’ that worked for me.If you could
produce a more precise example (or at least elaborate on “Doesn’t
work” (raises an exception, does nothing, has the wrong attributes,
something else…)
you might get a more helpful response.

Let’s see…

u = User.find(3)

=> #<User id: 3, company_id: 3, login: “tm_user”, email:
“removed_email_address@domain.invalid”, crypted_password:
“b695db100847aa269fb477443a289d875cf2e001”, salt:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, timezone: “UTC”,
remember_token: nil, remember_token_expires_at: nil, activation_code:
“bab0c2bc67d43b6871005559b114b9b62b7b70bb”, activated_at: “2008-11-19
22:12:07”, password_reset_code: nil, enabled: true, created_at:
“2008-11-19 22:12:07”, updated_at: “2008-11-19 22:12:07”,
lock_version: 4, address_id: nil>

u.to_xml

=> “<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n
<activated-at type=“datetime”>2008-11-19T22:12:07Z\n
bab0c2bc67d43b6871005559b114b9b62b7b70bb\n
<address-id type=“integer” nil=“true”>\n
<company-id type=“integer”>3\n
b695db100847aa269fb477443a289d875cf2e001\n
removed_email_address@domain.invalid\n <enabled
type=“boolean”>true\n <id type=“integer”>3\n
<lock-version type=“integer”>4\n
tm_user\n <password-reset-code
nil=“true”>\n <remember-token
nil=“true”>\n <remember-token-expires-at
type=“datetime” nil=“true”>\n
1e3a4ba1ccb233c2bbd92c3bdbb917307523671b\n
UTC\n\n”

Change the XML. Change the timezone from UTC to ABC

a = “<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n
<activated-at type=“datetime”>2008-11-19T22:12:07Z\n
bab0c2bc67d43b6871005559b114b9b62b7b70bb\n
<address-id type=“integer” nil=“true”>\n
<company-id type=“integer”>3\n
b695db100847aa269fb477443a289d875cf2e001\n
removed_email_address@domain.invalid\n <enabled
type=“boolean”>true\n <id type=“integer”>3\n
<lock-version type=“integer”>4\n
tm_user\n <password-reset-code
nil=“true”>\n <remember-token
nil=“true”>\n <remember-token-expires-at
type=“datetime” nil=“true”>\n
1e3a4ba1ccb233c2bbd92c3bdbb917307523671b\n
ABC\n\n”

Apply it back to the record.

u.from_xml(a)

u.from_xml(a)

=> #<User id: 3, company_id: 3, login: “tm_user”, email:
“removed_email_address@domain.invalid”, crypted_password:
“b695db100847aa269fb477443a289d875cf2e001”, salt:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, timezone: “UTC”,
remember_token: nil, remember_token_expires_at: nil, activation_code:
“bab0c2bc67d43b6871005559b114b9b62b7b70bb”, activated_at: “2008-11-19
22:12:07”, password_reset_code: nil, enabled: true, created_at:
“2008-11-19 22:12:07”, updated_at: “2008-11-19 22:12:07”,
lock_version: 4, address_id: nil>

Mmmmm. timezone is still UTC.

Let’s save it.

u.save
=> true

u
=> #<User id: 3, company_id: 3, login: “tm_user”, email:
“removed_email_address@domain.invalid”, crypted_password:
“b695db100847aa269fb477443a289d875cf2e001”, salt:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, timezone: “UTC”,
remember_token: nil, remember_token_expires_at: nil, activation_code:
“bab0c2bc67d43b6871005559b114b9b62b7b70bb”, activated_at: “2008-11-19
22:12:07”, password_reset_code: nil, enabled: true, created_at:
“2008-11-19 22:12:07”, updated_at: “2008-11-19 22:12:07”,
lock_version: 5, address_id: nil>

Looks like the time zone never got changed.

Let’s try with json

u.to_json
=> “{“user”: {“salt”:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, “activated_at”:
“2008-11-19T22:12:07Z”, “remember_token_expires_at”: null,
“crypted_password”: “b695db100847aa269fb477443a289d875cf2e001”,
“password_reset_code”: null, “lock_version”: 5,
“activation_code”: “bab0c2bc67d43b6871005559b114b9b62b7b70bb”,
“timezone”: “UTC”, “id”: 3, “enabled”: true, “address_id”:
null, “remember_token”: null, “company_id”: 3, “login”:
“tm_user”, “email”: “removed_email_address@domain.invalid”}}”

j = “{“user”: {“salt”: “1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, “activated_at”: “2008-11-19T22:12:07Z”, “remember_token_expires_at”: null, “crypted_password”: “b695db100847aa269fb477443a289d875cf2e001”, “password_reset_code”: null, “lock_version”: 5, “activation_code”: “bab0c2bc67d43b6871005559b114b9b62b7b70bb”, “timezone”: “ABC”, “id”: 3, “enabled”: true, “address_id”: null, “remember_token”: null, “company_id”: 3, “login”: “tm_user”, “email”: “tm_user@panztelcom”}}”
=> “{“user”: {“salt”:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, “activated_at”:
“2008-11-19T22:12:07Z”, “remember_token_expires_at”: null,
“crypted_password”: “b695db100847aa269fb477443a289d875cf2e001”,
“password_reset_code”: null, “lock_version”: 5,
“activation_code”: “bab0c2bc67d43b6871005559b114b9b62b7b70bb”,
“timezone”: “ABC”, “id”: 3, “enabled”: true, “address_id”:
null, “remember_token”: null, “company_id”: 3, “login”:
“tm_user”, “email”: “tm_user@panztelcom”}}”

j
=> “{“user”: {“salt”:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, “activated_at”:
“2008-11-19T22:12:07Z”, “remember_token_expires_at”: null,
“crypted_password”: “b695db100847aa269fb477443a289d875cf2e001”,
“password_reset_code”: null, “lock_version”: 5,
“activation_code”: “bab0c2bc67d43b6871005559b114b9b62b7b70bb”,
“timezone”: “ABC”, “id”: 3, “enabled”: true, “address_id”:
null, “remember_token”: null, “company_id”: 3, “login”:
“tm_user”, “email”: “tm_user@panztelcom”}}”

u.from_json(j)
=> #<User id: 3, company_id: 3, login: “tm_user”, email:
“removed_email_address@domain.invalid”, crypted_password:
“b695db100847aa269fb477443a289d875cf2e001”, salt:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, timezone: “UTC”,
remember_token: nil, remember_token_expires_at: nil, activation_code:
“bab0c2bc67d43b6871005559b114b9b62b7b70bb”, activated_at: “2008-11-19
22:12:07”, password_reset_code: nil, enabled: true, created_at:
“2008-11-19 22:12:07”, updated_at: “2008-11-19 22:12:07”,
lock_version: 5, address_id: nil>

u.save
=> true

u
=> #<User id: 3, company_id: 3, login: “tm_user”, email:
“removed_email_address@domain.invalid”, crypted_password:
“b695db100847aa269fb477443a289d875cf2e001”, salt:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, timezone: “UTC”,
remember_token: nil, remember_token_expires_at: nil, activation_code:
“bab0c2bc67d43b6871005559b114b9b62b7b70bb”, activated_at: “2008-11-19
22:12:07”, password_reset_code: nil, enabled: true, created_at:
“2008-11-19 22:12:07”, updated_at: “2008-11-19 22:12:07”,
lock_version: 6, address_id: nil>

Exact same story.


#4

On Nov 27, 10:10 pm, “Tim U.” removed_email_address@domain.invalid wrote:

Minus your mysterious ‘change the xml’ that worked for me.If you could
produce a more precise example (or at least elaborate on “Doesn’t
work” (raises an exception, does nothing, has the wrong attributes,
something else…)
you might get a more helpful response.

Let’s see…

Is timezone a protected attribute (as in attr_protected or not on the
list given to attr_accessible) ?
Is the accessor function timezone= overwridden ? Does it work if you
change other attributes?

Fred


#5

On Nov 27, 10:26 pm, “Tim U.” removed_email_address@domain.invalid wrote:

Is timezone a protected attribute (as in attr_protected or not on the
list given to attr_accessible) ?

No. It’s changeable by the web GUI too. Also if that was the case
you’d expect the validation to throw up an error right?

actually no. if you try to mass assign a attr_protected attribute then
it just ignores it (you’ll get a warning in the logs).

Is the accessor function timezone= overwridden ? Does it work if you
change other attributes?

No. It also doesn’t work if you attempt to change other attributies.

Change the login field to “tm_user"changed”

weird. I’d check your logs in case there’s a warning in there. This
sort of thing could happen if you had accidentally overwritten an
important activerecord method (eg if you had an association called
attributes) but hard to say without seeing more. you might find out
more if you were able to reduce this to a minimal example (or work the
other way - start with a fresh rails app & model and add stuff until
it breaks)

Fred


#6

Is timezone a protected attribute (as in attr_protected or not on the
list given to attr_accessible) ?

No. It’s changeable by the web GUI too. Also if that was the case
you’d expect the validation to throw up an error right?

Is the accessor function timezone= overwridden ? Does it work if you
change other attributes?

No. It also doesn’t work if you attempt to change other attributies.

Change the login field to “tm_user"changed”

j = “{“user”: {“salt”: “1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, “activated_at”: “2008-11-19T22:12:07Z”, “remember_token_expires_at”: null, “crypted_password”: “b695db100847aa269fb477443a289d875cf2e001”, “password_reset_code”: null, “lock_version”: 5, “activation_code”: “bab0c2bc67d43b6871005559b114b9b62b7b70bb”, “timezone”: “ABC”, “id”: 3, “enabled”: true, “address_id”: null, “remember_token”: null, “company_id”: 3, “login”: “tm_user_changed”, “email”: “tm_user@panztelcom”}}”

u.from_json(j)
=> #<User id: 3, company_id: 3, login: “tm_user”, email:
“removed_email_address@domain.invalid”, crypted_password:
“b695db100847aa269fb477443a289d875cf2e001”, salt:
“1e3a4ba1ccb233c2bbd92c3bdbb917307523671b”, timezone: “UTC”,
remember_token: nil, remember_token_expires_at: nil, activation_code:
“bab0c2bc67d43b6871005559b114b9b62b7b70bb”, activated_at: “2008-11-19
22:12:07”, password_reset_code: nil, enabled: true, created_at:
“2008-11-19 22:12:07”, updated_at: “2008-11-19 22:12:07”,
lock_version: 7, address_id: nil>

Nope no change. Let’s save it.

u.save
=> true

u.login
=> “tm_user”

Didn’t change.