2010-06-30 17 views
13

Mam polimorficzny stowarzyszenie, które wygląda tak:Korzystanie polimorficzne ścieżki z zagnieżdżonych stowarzyszeń

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 

Chciałbym prosty sposób utworzyć nowy wiersz z pozycji dominującej. Być może edytuję widok dla obiektu Work i chcę mieć łącze, które tworzy nowy obiekt Line. Zwykle robiłbym to:

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

A pomocnik będzie działał w tym celu. Wymaga to jednak sprawdzenia, do którego z rodziców należy linia w kontrolerze, co pozwala na pokonanie celu polimorfizmu (w takim przypadku mogłem użyć dwóch odniesień). Moje pytanie brzmi: jak uzyskać ścieżkę do pracy polimorficznej jak normalny helper?

+1

"To, czego szukam, to sposób na prezentację, powiedzmy, obiektu roboczego i utworzenie nowej linii, w którą można przejść." To zdanie bardzo mnie dezorientuje. Chcesz zmienić sformułowanie? –

+0

Edytowałem pytanie, aby było bardziej zrozumiałe. – Zoe

Odpowiedz

7

Możliwym sposobem może być użycie trasy tak:

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

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

Twój LinesController pozostaje taka sama, a dostaniesz tras, takie jak:

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

Najbardziej irytujące jest to, aby zarządzaj pierwszym identyfikatorem przekazanym, ponieważ będziesz mieć numer params[:id] oznaczony linią, ale będziesz mieć także params[:work_id] lub params[:education_id]. Tutaj musisz wybrać pomiędzy sprawdzeniem, który parametr został przekazany, lub przynajmniej przeanalizować żądany URL, aby określić, w którym jesteś (Works, Educations, etc ...).

Nadzieja to pomogło;)

EDIT:

Według tego, co pojawiło się w komentarzach, można użyć polymorphic_url/polymorphic_path (http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html):

To ma sens, jeśli używasz ich jak w ten sposób:

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

Przynajmniej ty Można nawet użyć go do kolekcji:

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

Wiwaty,
a.

+1

To jest sposób, aby to zrobić, ale w ogóle nie jest polimorficzny. Znalazłem wiele wariacji na ten temat i wygląda na to, że stowarzyszenia polimorficzne zostały włączone do ActiveRecord, ale zupełnie zapomniane w każdym innym miejscu. Miałem nadzieję, że tak nie jest, a ja po prostu patrzyłem w niewłaściwych miejscach. Będę o tym pamiętać, jeśli nie znajdę niczego innego. – Zoe

+0

Pokazałem wam trasy łączące skojarzenia modeli polimorficznych. –

+0

w prawo, ale trasy nie zachowują się polimorficznie, czego właśnie szukam. Trasa jest specyficzna dla tego, czy Linia należy do Pracy lub Edukacji, tak jak wynik kontrolny (: word_id i: education_id). Ponieważ oba te elementy powinny być powiązane z liniami jako obiektem Item, miałoby sens, gdyby istniał sposób na uzyskanie: item_id, który mógłby reprezentować Work lub Education. – Zoe

Powiązane problemy