I'd prefer the controller approach, since that's where the problem is IMO and 
where it should be solved. And it seems to me the controller way has the lowest 
amount of evil present.

I'd stay out of touching the addresses= method. I have a panic fear of changing 
any magic of ActiveRecord to different magic. I'm a bit afraid this would come 
bite us in the buttocks later.

Custom XML parser is probably safer, but it still somehow doesn't seem right to 
me that:
'<addresses>...' --> parse_xml_into_hash --> { 'addresses_attributes' => ...}
I think this is not the layer where the problem should be solved.

IMO the very essence of the problem is that we get params which ActiveRecord 
doesn't understand out of the box. Controllers are the right place to transform 
params so that our models understand them. (At least this is how the whole 
situation appears to me.)

With a little luck, this could be solved with a single before_filter that would 
alter params directly (evil, but controller actions stay untouched) or create 
something like transformed_params to be used instead of original params (not 
evil, but we have to use a different variable in controllers). I believe this 
can be solved in a reasonably generic way, so for each controller you'll have 
just something like:

before_filter { transform_associations_from_xml('user' => ['addresses']) }

and to illustrate a more complicated case:

before_filter { transform_associations_from_xml('user_group' => {'users' => 
['addresses', 'phones']}) }

Or maybe the keys that have to be changed could be autodetected from how the 
Hash is structured, so it might even become:

before_filter  :transform_associations_from_xml

Not sure if the last one ^^ is a good idea, we'd have to give it more thought.

So how about that?


Btw Martyn you described the problem very clearly and the sample app will 
enable us to hack on some solutions. Way to go for similar stuff ;)

J.

On 20.9.2012 14:20, Martyn Taylor wrote:
Gents.

I'm having some trouble with getting nested resources working properly from 
bespoke XML/JSON in RESTful API.  There seems to be some fundamental problems 
with the way rails works, which means we have to write a lot of bespoke code to 
get it working, possibly even having to monkey patch Rails itself.

I've written an example rails app that highlights the problem and put a 
detailed description in the README you can find it here:

https://github.com/mtaylor/Rails-Nested-Resource-Issues

I've ran into this issue on IME.  But it's going to affect us across all rails 
projects with REST APIs, so we could do with discussing this issue and coming 
up with the best possible solution that results in as little replication as 
possible.

Please read through the problem and let me know if you have any better ideas 
that the solutions I have proposed.

Regards

Martyn

Reply via email to