C'est moi ou ActiveResource est buggué?

Je bosse en ce moment avec ActiveResource et celui ci me donne du fil
à retordre.
J’ai deux models coté “serveur”

Songs: belong_to :artist et Artist: has_many :songs

J’ai également deux méthodes de controller :
une méthode songs dans ArtistsController qui me retourne un XML des
songs de l’Artist
et
une méthode list_by_artist dans SongsController qui me retourne les
songs d’un Artist

Tout cela est RESTFUL
map.resources :artists, :member => {:songs => :get}
map.resources :songs, :collection => {:list_by_artist => :get}

J’ai bien conscience que ces deux méthodes font la même chose mais :

Je voudrais côté client (ActiveResource) récupérer la liste des songs
d’un artist comme des objets Songs (pas des Array)

Je peux écrire :
Artist.find(1).get(:songs) pour récupérer un Array
mais
Artist.find(1).find(:songs) me renvoie une NoMethodError pour la
méthode find

Je peut aussi faire

Song.get(:list_by_artist, :id => 1) # la aussi je récupère un
Array…
mais
Song.find(:list_by_artist, :id => 1) me renvoi :

ArgumentError: expected an attributes Hash, got []
from /var/lib/gems/1.8/gems/activeresource-2.1.0/lib/
active_resource/base.rb:883:in load' from /var/lib/gems/1.8/gems/activeresource-2.1.0/lib/ active_resource/base.rb:639:ininitialize’
from /var/lib/gems/1.8/gems/activeresource-2.1.0/lib/active_resource/
base.rb:587:in new' from /var/lib/gems/1.8/gems/activeresource-2.1.0/lib/active_resource/ base.rb:587:ininstantiate_record’

Rails semble tenter instantier un “record” (instantiate_record) là où
il devrait le faire pour une collection (instantiate_collection)

Il y a t-il une solution à ce problème ?
Est ce que je m’y prend mal ou est ce que ca vient de Rails ?

J’ai déjà codé un petit patch pour avoir le comportement attendu dans
le cas “Song.find(:list_by_artist, :id => 1)” mais j’aimerais d’abord
être sur que le problème vient bien de Rails et pas de moi avant de
soumettre ce pseudo bug.

J’ai eu deux trois mails “persos” pour m’expliquer qu’il suffisait de
faire artist.songs ou encore des find_all_by_artist_id, mais tout ceci
ne fonction que dans ActiveRecord, pas dans activeResource, donc si
qqn à une meilleure idée, je suis toujours à l’écoute.

Bon j’aurais fait les questions et les réponses sur ce thread mais au
cas ou ca puisse aider quelqu’un voilà la solution :

Song.find(:all, :from => :list_by_artist, :params => {:artist_id =>
1})
fera bien un appel à
http://monsite/songs/list_by_artist?artist_id=1

avant d’instantier les résultats comme des objets ActiveResource.

Ma confusion est venu de cet article
http://ryandaigle.com/articles/2007/4/26/what-s-new-in-edge-rails-activeresource-gets-custom-methods
de Ryan Daigle et DHH qui malheureusement est soit faux (pour le
dernier exemple), soit plus à jour (plus probable).

Merci quand même :smiley:

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs