Meine Rails Ansichten und Controller sind mit übersät redirect_to
, link_to
und form_for
Methodenaufrufe. Manchmal link_to
und redirect_to
explizit in den Pfaden, die sie verknüpfen (z. B. link_to 'New Person', new_person_path
), aber oft sind die Pfade implizit (z link_to 'Show', person
. B. ).
Ich füge meinem Modell eine einzelne Tabellenvererbung (STI) hinzu (sagen wir Employee < Person
), und alle diese Methoden brechen für eine Instanz der Unterklasse ab (sagen wir Employee
). Wenn Schienen ausgeführt werden link_to @person
, tritt ein Fehler auf undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails sucht nach einer Route, die durch den Klassennamen des Objekts definiert ist, bei dem es sich um einen Mitarbeiter handelt. Diese Mitarbeiterrouten sind nicht definiert, und es gibt keinen Mitarbeiter-Controller, sodass die Aktionen auch nicht definiert sind.
Diese Frage wurde schon einmal gestellt:
- Bei StackOverflow besteht die Antwort darin, jede Instanz von link_to usw. in Ihrer gesamten Codebasis zu bearbeiten und den Pfad explizit anzugeben
- Bei StackOverflow schlagen zwei Personen erneut vor,
routes.rb
die Ressourcen der Unterklasse der übergeordneten Klasse (map.resources :employees, :controller => 'people'
) zuzuordnen . Die oberste Antwort in derselben SO-Frage schlägt vor, jedes Instanzobjekt in der Codebasis mit zu typisieren.becomes
- Eine weitere Antwort bei StackOverflow ist die Antwort im Do Do Repeat Yourself-Camp und schlägt vor, für jede Unterklasse ein doppeltes Gerüst zu erstellen.
- Hier ist wieder die gleiche Frage bei SO, wo die Top-Antwort einfach falsch zu sein scheint (Rails Magic Just Works!).
- An anderer Stelle im Web habe ich diesen Blog-Beitrag gefunden, in dem F2Andy empfiehlt, den Pfad überall im Code zu bearbeiten.
- In dem Blogbeitrag Single Table Inheritance und RESTful Routes bei Logical Reality Design wird empfohlen, die Ressourcen für die Unterklasse dem Superklassen-Controller zuzuordnen, wie in SO-Antwort Nummer 2 oben.
- Alex Reisner hat eine Post- Single-Table-Vererbung in Rails , in der er sich dafür einsetzt, die Ressourcen der untergeordneten Klassen nicht der übergeordneten Klasse in
routes.rb
zuzuordnen, da dadurch nur Routing-Brüche vonlink_to
undredirect_to
, aber nicht von abgefangen werdenform_for
. Daher empfiehlt er, der übergeordneten Klasse stattdessen eine Methode hinzuzufügen, damit die Unterklassen über ihre Klasse lügen. Hört sich gut an, aber seine Methode hat mir den Fehler gegebenundefined local variable or method `child' for #
.
So ist die Antwort , die eleganteste scheint und hat die meisten Konsens (aber es ist nicht alles , dass elegant, noch , dass viel Konsens), die die Ressourcen , um Ihre hinzufügen routes.rb
. Nur dass das nicht funktioniert form_for
. Ich brauche etwas Klarheit! Um die oben genannten Optionen zu destillieren, sind meine Optionen
- Ordnen Sie die Ressourcen der Unterklasse dem Controller der Oberklasse in zu
routes.rb
(und hoffen Sie, dass ich form_for für keine Unterklassen aufrufen muss). - Überschreiben Sie interne Methoden für Schienen, damit die Klassen sich gegenseitig belügen
- Bearbeiten Sie jede Instanz im Code, in der der Pfad zur Aktion eines Objekts implizit oder explizit aufgerufen wird, indem Sie entweder den Pfad ändern oder das Objekt typumwandeln.
Bei all diesen widersprüchlichen Antworten brauche ich eine Entscheidung. Mir scheint, es gibt keine gute Antwort. Ist dies ein Fehler im Design der Schienen? Wenn ja, ist es ein Fehler, der möglicherweise behoben wird? Oder wenn nicht, dann hoffe ich, dass mich jemand klarstellen kann, mich durch die Vor- und Nachteile jeder Option führt (oder erklärt, warum dies keine Option ist) und welche die richtige Antwort ist und warum. Oder gibt es eine richtige Antwort, die ich im Web nicht finde?