5

ho implementato l'ereditarietà singola tabella per una classe di personarotti Rails Itinerari dopo l'implementazione Tabella ereditarietà singola

class Person < ActiveRecord::Base 

end 


class Teacher < Person 

end 

class Student < Person 

end 

class Outsider < Person 

end 

E la persona creare sembra funzionare creazione insegnante, studente o persona in base al quale viene scelto in forma .seleziona e viene aggiunto l'attributo type.

Tuttavia, mi sembra di aver rotto le vie

<% = link_to 'Edit', edit_person_path (@deal)%> | <% = link_to 'Indietro', person_path%>

Sembra che puntino a percorso_insegnante, percorso_scuola e percorso_sestider invece di percorso_personale.

Quali modifiche devono essere apportate nei percorsi?

risposta

2

prima generare i controller per i vostri modelli ...

rails generate controller Persons 
rails generate controller Teachers 
rails generate controller Students 
rails generate controller Outsiders 

poi nel routes.rb (binari 3)

resources :persons 
resources :teachers 
resources :students 
resources :outsiders 

garantisce riposo percorsi

esempio

persons GET /persons(.:format) {:action=>"index", :controller=>"persons"} 
new_person GET /person/new(.:format) {:action=>"new", :controller=>"persons"} 
edit_person GET /persons/:id/edit(.:format) {:action=>"edit", :controller=>"persons"} 
person GET /persons/:id(.:format) {:action=>"show", :controller=>"persons"} 
persons POST /spersons(.:format) {:action=>"create", :controller=>"persons"}  
person PUT /persons/:id(.:format) {:action=>"update", :controller=>"persons"}  
person DELETE /persons/:id(.:format) {:action=>"destroy", :controller=>"persons"} 

lo stesso per l'insegnante, studente e l'outsider

percorsi di controllo rake o rastrello rotte | grep teachers

+2

Non voglio diversi controller per ciascuno di essi – Arc

+0

modo si perde REST aggiungere in routes.rb partita 'degli insegnanti /' => "persone # indice",: come =>: insegnanti match 'insegnante /: id (.: format) '=> "persons # show",: as =>: insegnanti e così via ... – codevoice

+1

funziona, ma non è affatto ASCIUTTO - finirai per ripetere tutto il codice del controller, e il codice di visualizzazione più e più volte per ogni sottoclasse – Tilo

1

Dalla mia esperienza, è meglio utilizzare un controller singolo per tutti i modelli STI. Se si mantengono i controller ASCIUTATI, non è necessario disporre di una logica di controller univoca per ogni classe figlio. Mantieni tutto ciò nei modelli.

resources :people 

I tuoi percorsi denominati saranno come:

people_path 
new_person 
edit_person 
person 
etc... 

quindi è possibile utilizzare lo stesso controller/vista per gestire questi modelli. Se in seguito si decide di aggiungere nuovi modelli di Person STI, non sarà necessario apportare aggiornamenti significativi al codice.

+2

Questo non sembra funzionare. Per <% = link_to 'Modifica', edit_person_path (@deal)%> prova a trovare edit_teacher_path (@user) e fallisce – Arc

+0

stavo lottando con questo io proprio ora .. Voglio trattare i miei sub-modelli in modo significativamente diverso nelle viste e preferirei non avere un sacco di logica condizionale nel controller o nella vista ... pensieri? –

Problemi correlati