Impossible to get data with ActiveResource

Hi,

I’m trying to work with a RESTful server but I have some problem to
setup
my project.
I have a model class like this :

class User < ActiveResource::Base

self.site =

http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/users/

end

this controller :

class UsersController < ApplicationController

def new

end

def index

@users = User.find(:all)
respond_to do |format|
  format.html # index.html.erb

  format.json { render :json => @users }

  format.xml  { render :xml => @users}

  end

end

end

and simply this view :

<% @users.each do |user| %>

<%= user.username %>

<% end %>

But I can’t retrieve the data, @users is empty.
Anyone has an idea how to fix this issue?

Thanks

On 18 October 2012 23:30, chardy [email protected] wrote:

But I can’t retrieve the data, @users is empty.
Anyone has an idea how to fix this issue?

Is there anything useful in log/development.log?

Colin

Thanks for your help Colin!

My logs :

Started GET “/users/index” for 127.0.0.1 at Thu Oct 18 23:01:19 +0200
2012

1: <% @users.each do |user| %>

I think the problem is the Error 500…? It’s strange because if you try
the link in the browser it’s works…
Thanks for your help!

On 21 October 2012 11:45, chardy [email protected] wrote:

4: <% end %>

app/views/users/index.html.erb:1:in
`_app_views_users_index_html_erb___162613411_2191123680’

I think the problem is the Error 500…? It’s strange because if you try the
link in the browser it’s works…

The 500 error is not the problem, that is just the result of @users
being nil.

I think you need to enable logging so that you can see what
activeresource is doing. I have not used activeresource but a quick
google found [1] which looks useful and has a section Logging
Requests. Hopefully you will then see what is going on.

Colin

[1]

On Sun, Oct 21, 2012 at 7:06 AM, chardy [email protected] wrote:

GET http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/users/users.xml
→ 404 Not Found 32 (129ms)

The server is not configured to respond for .xml (or .json).

If this server isn’t under your control, shouldn’t you have some kind
of documentation on what it does – what requests it responds to and
in what format?


Hassan S. ------------------------ [email protected]

twitter: @hassan

Yes, it’s for a project in my university. I know that the we need to
specify the format in the header and the server can handle json and xml
format.

Here is the documentation :

Read only resources:

  • SportsResource / - Get list of all sports [GET, public]

  • UsersResource /users/ - Get list of all users [GET, public]

  • PartnershipsResource /partnerships/ - Get list of all partnerships
    [GET,
    public]

  • SportResource /sports/{sportname} - Get sport entity and its list of
    subscriptions [GET, public]

“Public” write resources:

  • UserResource /users/{username} - Get user entity [GET, public*] -
    Create
    new user [PUT, public]

  • Update user profile [PUT, private] - Delete user [DELETE, private]

Private write resources:

  • PartnershipResource /partnerships/{username1};{username2}/ - Get
    partnership entity [GET, public*]

  • Propose (or confirm** proposed) partnership [PUT, private]

  • Delete (or decline** proposed) partnership [DELETE, private]

  • SubscriptionResource /users/{username}/{sportname} - Get subscription
    entity [GET, public*] /partnerships/{username1};{username2}/{sportname}/

Subscribe (as user or partnership) to a sport [PUT, private]

  • Update subscription [PUT, private]

  • Submit new entry [POST, private]

  • Delete subscription [DELETE, private]

  • EntryResource /[uri of subscription]/{entityid} - Get entry entity
    [GET,
    public*] - Update entry data [PUT, private]

  • Delete entry [DELETE, private]

  • = Read accessability depends on the privacy settings for the
    respective
    entities ** = A partnership is created/deleted in the following way:

    PUT by user1 proposes a new partnership. PUT by user2 confirmes the
    proposal and the partnership becomes “operational”

    DELETE on an operational partnership results in a proposed
    partnership.
    DELETE on a proposed partnership deletes it.

On 21 October 2012 15:06, chardy [email protected] wrote:

Yes, good idea, now I can understand where is the problem :

GET http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/users/users.xml

Is the url supposed to be resources/users/users.xml? Perhaps it
should just be resources/users.xml.

Colin

Yes, good idea, now I can understand where is the problem :

GET
http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/users/users.xml
→ 404 Not Found 32 (129ms)

The server is not configured to respond for .xml (or .json). The content
type should be defined in the header…
Is it possible to setup this in ruby…?

Thanks a lot!

On Sun, Oct 21, 2012 at 7:44 AM, chardy [email protected] wrote:

  • UsersResource /users/ - Get list of all users [GET, public]

Not much for “documentation” :-/

http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/users

returns an HTML page with a paginated listing of users, but that’s
hardly what you want for ActiveResource.

If no more info on this server is available, I’d probably poke at it a
bit
with wget or curl to see if I could get a useful response.

Good luck!

Hassan S. ------------------------ [email protected]

twitter: @hassan

So, I tried to overwrite the methode collection_path :

def collection_path(prefix_options = {}, query_options = nil)
check_prefix_options(prefix_options)
prefix_options, query_options = split_options(prefix_options) if
query_options.nil?
“#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}”
end
by

def collection_path(prefix_options = {}, query_options = nil)
check_prefix_options(prefix_options)
prefix_options, query_options = split_options(prefix_options) if
query_options.nil?
“#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}”
end

And now it’s OK :slight_smile:
*GET http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/users
→ 200 OK 1260 (1735.7ms)
*
*
*
…But :frowning:
I have an other error now :

NoMethodError (undefined method collect!' for #<Hash:0x1030aeed0>): app/controllers/users_controller.rb:6:in index’

Anyone has an idea

Thanks a lot for your support!

On 21 October 2012 21:53, chardy [email protected] wrote:

→ 200 OK 1260 (1735.7ms)

…But :frowning:
I have an other error now :

NoMethodError (undefined method collect!' for #<Hash:0x1030aeed0>): app/controllers/users_controller.rb:6:in index’

What do you think that error might mean?

Colin

Yes, sorry I made a mistake it’s only users.xml but the problem is the
same…
Is it possible to retrieve the data without the extension .xml but just
specify the type in the header?

I have not found anything on the web…

It’s finally seems to work :slight_smile:
My ActiveResource model looks like this :

class User < ActiveResource::Base
class << self
def element_path(id, prefix_options = {}, query_options = nil)
check_prefix_options(prefix_options)
prefix_options, query_options = split_options(prefix_options) if
query_options.nil?
“#{prefix(prefix_options)}#{collection_name}/#{URI.parser.escape
id.to_s}#{query_string(query_options)}”
end

def collection_path(prefix_options = {}, query_options = nil)
  check_prefix_options(prefix_options)
  prefix_options, query_options = split_options(prefix_options) if

query_options.nil?

“#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}”
end
def instantiate_collection(collection, prefix_options = {})
collection = collection[element_name.pluralize] if
collection.instance_of?(Hash)
collection.collect! { |record| instantiate_record(record,
prefix_options) }
end
end
self.site =
http://diufvm31.unifr.ch:8090/CyberCoachServer/resources/
end

I founded how to solve the last error here
: ActiveResource undefined method `collect!' for #<Hash:0x0000010367cc90> · Issue #2318 · rails/rails · GitHub

Thanks a lot for your support! :slight_smile: