Ca faisait longtemps que j'avais pas trouvé une question tordue à poser,
en
voici une pour les amateurs :
Dans un contexte REST, j'ai un modèle Person :
class Person < AR::B
...
belongs_to :personable, :polymorphic => true
...
end
Un des éléments auxquels il s'attache est Lender, avec plusieurs
attachements polymorphiques :
class Lender < AR::B
...
with_scope(:has_one => {:as => :personable, :dependent => :destroy})
do
has_one :lender, :conditions => "personable_role = 'lender'"
has_one :manager, :conditions => "personable_role = 'manager'"
has_one :governor, :conditions => "personable_role = 'governor'"
has_one :coordinator, :conditions => "personable_role =
'coordinator'"
end
...
end
Et je veux pouvoir faire des belles requêtes REST du style :
GET /lenders/1/lenders/1
POST /lenders/1/governor
etc.
L'idéal niveau simplicité serait de faire en sorte d'exploiter le
PeopleController pour effectuer les actions correspondantes en ayant le
paramètre "personable_role" ajouté en plus. Par exemple :
GET /lenders/1/managers/new => {:controller => :people, :action => :new,
:personable_role => :manager}
J'ai trouvé ça qui fait *presque* ce que j'aimerai :
[config/routes.rb]
map.resources :lenders do |lenders|
lenders.resources :people, :as => :lenders
lenders.resources :people, :as => :managers
lenders.resources :people, :as => :governors
lenders.resources :people, :as => :coordinators
end
Sauf que là , il n'y a pas de paramètre "personable_role" (ou paramètre
équivalent) à ma connaissance.
Est-ce que quelqu'un à une idée de comment faire cette acrobatie le plus
proprement possible ?
--
Michel Belleville
on 04.08.2008 15:20
on 04.08.2008 22:22
Salut Michel, à moins d'avoir mal compris ta question... si tu prends le dernier exemple où plusieurs routes tapent dans le même contrôleur, pourquoi n'utiliserais-tu pas un before_filter qui te récupérerais ton paramètre personal_role directement en analysant request_uri (ou équivalant) ? Nicolas. Michel Belleville a écrit :
on 04.08.2008 23:00
Mon problème venait de ne pas savoir comment passer ce paramètre.
Mais j'ai fini par bricoler un truc dont je suis suffisement content
pour
l'instant :
class PeopleController < AC
...
helper_method :role
def role
request.request_uri[/lender|manager|governor|coordinator/]
end
...
end
Pas vraiment besoin de before_filter, c'est accessible de la vue et ça
permet de préparer mes objets pour les sauvegardes.
Merci pour l'idée ceci dit.