ActiveResource and REST API

Ran into a great problem. REST, as it’s implimented via Rails, identifies the URL as a plural in every case. So you would retrieve a single issue through /issues/. This seems to be technically incorrect.

I find other (non-Rails) documentation talking about this being singular for getting a single issue and plural for a list.

And this is also how the site I’m trying to access is configured. Which means that every time I try to GET a single issue the ActiveResource is calling for /issues/ instead of the correct /issue/.

Does anyone know of a way to workaround this problem using ActiveResource?

Maybe I should ask if anyone else agrees that this is a problem in the implementation of the REST api in ActiveResource?

Sounds like you want to look at collection_name on your class.

More here…

http://www.quarkruby.com/2008/3/11/consume-non-rails-style-rest-apis/

Well, I added an inflector to fix this one.

And I had to strip the ‘.json’ by adding this to the model:

class << self

def element_path(id, prefix_options = {}, query_options = nil)

prefix_options, query_options = split_options(prefix_options) if query_options.nil?

“#{prefix(prefix_options)}#{collection_name}/#{id}#{query_string(query_options)}”

end

def collection_path(prefix_options = {}, query_options = nil)

prefix_options, query_options = split_options(prefix_options) if query_options.nil?

“#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}”

end

end

but I have a lot of associated models to create for this API. Where do I put something like this to override ALL instances of the ActiveResource element_path and collection_path calls?

Tom Allison wrote in post #1070825:

Ran into a great problem. REST, as it's implimented via Rails, identifies the URL as a plural in every case. So you would retrieve a single issue through /issues/<insert key here>. This seems to be technically incorrect.

I find other (non-Rails) documentation talking about this being singular for getting a single issue and plural for a list.

And this is also how the site I'm trying to access is configured. Which means that every time I try to GET a single issue the ActiveResource is calling for /issues/<insert key here> instead of the correct /issue/<insert key here>.

Does anyone know of a way to workaround this problem using ActiveResource?

Maybe I should ask if anyone else agrees that this is a problem in the implementation of the REST api in ActiveResource?

What you express is not a problem. You're confusing parameters and actual path segments. The url in rails is indicative of the controller and action at that point in the site. At its core rails routing looks something like map.connect ':controller/:action/:id.:format' actions assigned restful verbs will figure out on their own path, but custom actions will need their own path segment.

something like mydomain.com/issues means route to the 'issues' controller with no paramaters, which most commonly will go to the index action.

something like mydomain.com/issues/4 means route to the 'issues' controller with parameters {id: 4}. By default mydomain.com/issue/4 would go to a different controller ('issue' which would cause naming conflicts). You can of course get around this by hardcoding resource paths.

So from there you can figure out where /publishers/1/magazines/2/photos/3 goes. Publishers controller, get action, param id:1, magazines controller, get action,....

This should tell you everything you need to know

Whether or not inflections and pluralizations are a good thing to begin with, that's a whole nother thread.