Ruby Forum Rails France > Liens polymorphiques multiples avec conditions

Posted by Michel Belleville (Guest)
on 04.08.2008 15:20
(Received via mailing list)
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
Posted by Nicolas Blanco (slainer68)
on 04.08.2008 22:22
(Received via mailing list)
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 :
Posted by Michel Belleville (Guest)
on 04.08.2008 23:00
(Received via mailing list)
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.