2010-06-30 13 views
13

Ho un'associazione polimorfica che assomiglia a questo:Uso dei percorsi polimorfe con associazioni annidati

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 

mi piacerebbe un modo semplice per creare una nuova linea dalla voce genitore. Quindi, potrei modificare una vista per un oggetto Work e voglio avere un collegamento che crea un nuovo oggetto Line. Normalmente, vorrei fare questo:

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

E l'aiutante avrebbe funzionato il percorso per questo. Tuttavia, ciò richiede che io controlli a quale genitore appartiene la linea nel controllore, vanificando lo scopo del polimorfismo (avrei potuto usare due riferimenti se così fosse). Quindi, la mia domanda è, come faccio a ottenere il percorso per lavorare in modo polimorfico come un normale helper di percorsi?

+1

"Quello che sto cercando è un modo per essere in vista, ad esempio, per un oggetto di lavoro e creare una nuova linea per utilizzarla." Questa frase mi confonde molto. Cura di riformulare? –

+0

Ho modificato la domanda per essere più chiara. – Zoe

risposta

7

Un modo possibile potrebbe essere quella di utilizzare percorsi come questo:

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

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

tuo LinesController rimane lo stesso, e si otterrà percorsi come questi:

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

La parte più fastidiosa è quella di gestisci il primo id passato, perché avrai un params[:id] riferito a una linea, ma avrai anche params[:work_id] o params[:education_id]. Qui è necessario scegliere tra controllare quale param è passato, o almeno analizzare l'url richiesto per determinare in quale sia (Works, Educations, ecc ...).

Spero che questo ha aiutato;)

EDIT:

Secondo quanto emerso nei commenti, è possibile utilizzare polymorphic_url/polymorphic_path (http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html):

Ha senso se li usate come in questo modo:

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

Almeno, tu può anche utilizzare per le collezioni:

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

Cheers,
a.

+1

Questo è un modo per farlo, ma non è affatto polimorfico. Ho trovato molte variazioni su questo, e sembra che le associazioni polimorfiche siano state incluse in ActiveRecord, ma completamente dimenticate in ogni altro posto. Speravo che non fosse effettivamente il caso, e ho appena guardato nei posti sbagliati. Lo terrò a mente se non riesco a trovare nient'altro, però. – Zoe

+0

Ti ho mostrato percorsi che mantengono le tue associazioni di modelli polimorfici. –

+0

giusto, ma i percorsi non si comportano in modo polimorfico, che è quello che sto cercando. Il percorso è specifico se la Linea appartiene a un'Opera o a un'istruzione, come è il risultato nel controllore (: word_id e: education_id). Poiché entrambi dovrebbero essere associati alle linee come oggetto Item, avrebbe senso se ci fosse un modo per ottenere un item_id in quel campo che potrebbe rappresentare Work o Education. – Zoe

Problemi correlati