2010-06-30 4 views
13

j'ai une association polymorphique qui ressemble à ceci:Utilisation de chemins polymorphes avec les associations imbriquées

class Line < ActiveRecord::Base 
    belongs_to :item, :polymorphic => true 
end 

class Education < ActiveRecord::base 
    has_many :lines, :as => :item 
end 

class Work < ActiveRecord::base 
    has_many :lines, :as => :item 
end 

Je voudrais une façon simple de créer une nouvelle ligne de l'élément parent. Ainsi, je suis peut-être en train d'éditer une vue pour un objet Work, et je veux avoir un lien qui crée un nouvel objet Line. Normalement, je ferais ceci:

<%= link_to "New Line", new_work_line_path(@work) %> 

Et l'aide ferait l'itinéraire pour ceci. Cependant, cela nécessite que je vérifie à quel parent la ligne appartient dans le contrôleur, en vainant le but du polymorphisme (j'aurais pu utiliser deux références si c'était le cas). Donc, ma question est, comment puis-je obtenir le chemin de travailler polymorphiquement comme un assistant de chemin normal?

+1

"Ce que je cherche, c'est une façon d'être en vue, disons, d'un objet de travail, et de créer une nouvelle ligne pour y aller." Cette phrase me confond énormément. Voulez-vous reformuler? –

+0

J'ai édité la question pour être plus clair. – Zoe

Répondre

7

Une possibilité pourrait être d'utiliser des routes comme ceci:

map.resources :works do |works| 
    works.resources :lines 
end 

map.resources :educations do |edu| 
    edu.resources :lines 
end 

Votre LinesController reste le même, et vous obtiendrez des itinéraires comme celles-ci:

work_lines GET /works/:work_id/lines 
.... 
education_lines GET /educations/:education_id/lines 
... 

La partie la plus ennuyeuse est de gérer le premier id passé, parce que vous aurez un params[:id] référé à une ligne, mais vous aurez également params[:work_id] ou params[:education_id]. Ici, vous devez choisir entre vérifier quel param est passé, ou au moins analyser l'URL demandée pour déterminer dans quel vous êtes (Works, Educations, etc ...).

Hope this aidé;)

EDIT:

Selon ce qui a émergé dans les commentaires, vous pouvez utiliser polymorphic_url/polymorphic_path (http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html):

Il est logique si vous les utilisez comme de cette façon:

link_to "New Line", polymorphic_url(@line.item,@line) 
# => /<educations_or_works>/item_id/lines/line_id 

Au moins, vous peut même l'utiliser pour les collections:

link_to "New Line", polymorphic_url(@line.item,Line.new) 
# => /<educations_or_works>/item_id/lines/ 

Cheers,
a.

+1

C'est un moyen de le faire, mais ce n'est pas du tout polymorphe. J'ai trouvé beaucoup de variations à ce sujet, et il semble que les associations polymorphes aient été incluses dans ActiveRecord, mais complètement oubliées dans tous les autres endroits. J'espérais que ce n'était pas vraiment le cas, et j'ai juste regardé dans les mauvais endroits. Je garderai cela à l'esprit si je ne peux pas trouver autre chose, cependant. – Zoe

+0

Je vous ai montré des routes qui maintenaient vos associations de modèles polymorphyques. –

+0

à droite, mais les routes ne se comportent pas polymorphiquement, ce que je cherche. La route est spécifique à savoir si la ligne appartient à une œuvre ou à une éducation, comme c'est le cas dans le contrôleur (: word_id et: education_id). Étant donné que ces deux éléments sont supposés être associés à des lignes en tant qu'objet Item, il serait logique de trouver un élément: item_id qui pourrait représenter Work ou Education. – Zoe