I miei Rails viste e controllori sono disseminati di redirect_to
, link_to
e form_for
chiamate di metodo. A volte link_to
e redirect_to
sono espliciti nei percorsi che collegano (ad es. link_to 'New Person', new_person_path
), Ma molte volte i percorsi sono impliciti (ad es link_to 'Show', person
.).
Aggiungo un po 'di ereditarietà a tabella singola (STI) al mio modello (ad esempio Employee < Person
) e tutti questi metodi si interrompono per un'istanza della sottoclasse (ad esempio Employee
); quando viene eseguita la rota link_to @person
, si verifica un errore undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails sta cercando una rotta definita dal nome della classe dell'oggetto, che è dipendente. Queste route dei dipendenti non sono definite e non esiste un controller dei dipendenti, pertanto non sono definite nemmeno le azioni.
Questa domanda è stata posta prima:
- Su StackOverflow , la risposta è modificare ogni istanza di link_to etc nell'intera base di codice e indicare esplicitamente il percorso
- Su StackOverflow di nuovo, due persone suggeriscono di utilizzare
routes.rb
per mappare le risorse della sottoclasse sulla classe genitore (map.resources :employees, :controller => 'people'
). La risposta migliore in quella stessa domanda SO suggerisce di usare il cast di ogni oggetto di istanza nella base di codice.becomes
- Ancora un altro in StackOverflow , la risposta migliore è nel campo Do Repeat Yourself, e suggerisce di creare impalcature duplicate per ogni sottoclasse.
- Ecco di nuovo la stessa domanda in SO, dove la risposta migliore sembra essere sbagliata (Rails Magic funziona solo!)
- Altrove sul Web, ho trovato questo post sul blog in cui F2Andy consiglia di modificare il percorso ovunque nel codice.
- Nel post del blog Ereditarietà a tabella singola e percorsi RESTful in Logical Reality Design, si consiglia di mappare le risorse per la sottoclasse al controller della superclasse, come nella risposta SO numero 2 sopra.
- Alex Reisner ha un post Single Table Inheritance in Rails , in cui si propone di non mappare le risorse delle classi secondarie con la classe genitore
routes.rb
, poiché ciò rileva solo le interruzioni del routing dalink_to
eredirect_to
, ma non daform_for
. Quindi raccomanda invece di aggiungere un metodo alla classe genitore per far mentire le sottoclassi sulla loro classe. Sembra buono, ma il suo metodo mi ha dato l'erroreundefined local variable or method `child' for #
.
Quindi la risposta che sembra più elegante e ha la maggior parte del consenso (ma non è tutto quello elegante, né che tanto consenso), è l'aggiungere le risorse per il vostro routes.rb
. Solo che non funziona form_for
. Ho bisogno di un po 'di chiarezza! Per distillare le scelte sopra, le mie opzioni sono
- mappare le risorse della sottoclasse al controller della superclasse in
routes.rb
(e spero di non aver bisogno di chiamare form_for su qualsiasi sottoclasse) - Sovrascrivi i metodi interni delle rotaie per far sì che le classi si trovino reciprocamente
- Modifica ogni istanza nel codice in cui viene invocato il percorso dell'azione di un oggetto in modo implicito o esplicito, modificando il percorso o eseguendo il cast del tipo dell'oggetto.
Con tutte queste risposte contrastanti, ho bisogno di una sentenza. Mi sembra che non ci sia una buona risposta. È un fallimento nel design delle rotaie? In tal caso, è un bug che può essere corretto? Oppure, in caso contrario, spero che qualcuno possa darmi una dritta su questo, guidarmi attraverso i pro ei contro di ogni opzione (o spiegare perché non è un'opzione), e quale è la risposta giusta e perché. O c'è una risposta giusta che non sto trovando sul web?