Mon Rails de vues et les contrôleurs sont jonché redirect_to
, link_to
, et form_for
des appels de méthode. Parfois, link_to
et redirect_to
sont explicites dans les chemins qu'ils sont de liaison (par exemple, link_to 'New Person', new_person_path
), mais de nombreuses fois les chemins sont implicites (par exemple, link_to 'Show', person
).
J'ai ajouter un peu unique de l'héritage de table (STI) pour mon modèle (disons Employee < Person
), et l'ensemble de ces méthodes de pause pour une instance de la sous-classe (disons Employee
); lorsque les rails exécute link_to @person
, c'erreurs avec undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails est à la recherche d'un itinéraire défini par le nom de la classe de l'objet, qui est employé. Ces employés routes ne sont pas définies, et il n'est pas un employé du contrôleur afin que les actions ne sont pas définis.
Cette question a été posée:
- À StackOverflow, la réponse est d'éditer chaque instance de link_to etc dans l'ensemble de votre base de code, et de l'état du chemin explicitement
- Sur StackOverflow de nouveau, deux personnes suggèrent d'utiliser
routes.rb
de la carte de la sous-classe des ressources pour la classe parent (map.resources :employees, :controller => 'people'
). La réponse sommet dans la même DONC, la question suggère de conversion de type, chaque instance de l'objet dans la base de code à l'aide de.becomes
- Encore un autre à StackOverflow, la réponse sommet est la façon de le Faire Répéter Vous-même camp, et suggère la création d'dupliquer un échafaudage pour chaque sous-classe.
- Voici la même question, DONC, où la première réponse semble juste être mauvais (les Rails de la magie Fonctionne, tout Simplement!)
- Ailleurs sur le web, j'ai trouvé ce blog où F2Andy recommande d'édition dans le chemin d'accès partout dans le code.
- Sur le post de blog Unique de l'Héritage de Table et de repos des Routes à la Logique de la Réalité de la Conception, il est recommandé de recenser les ressources pour la sous-classe de super-classe de contrôleur, comme dans la réponse à la question 2 ci-dessus.
- Alex Reisner a un post Unique Héritage de Table dans les Rails, dans lequel il dénonce la cartographie des ressources de l'enfant des classes de la classe parente en
routes.rb
, étant donné que seules les captures de routage des ruptures delink_to
etredirect_to
, mais pas à partir d'form_for
. Donc, il recommande plutôt l'ajout d'une méthode de la classe parente pour obtenir les sous-classes à mentir à propos de leur classe. Sonne bien, mais sa méthode m'a donné l'erreurundefined local variable or method `child' for #
.
Donc la réponse qui semble le plus élégant et le plus consensus (mais c'est pas tout qu' élégant, ni que le niveau de consensus), est le complément de ressources pour votre routes.rb
. Sauf que ça ne fonctionne pas pour form_for
. J'ai besoin d'un peu de clarté! Pour en distiller les choix ci-dessus, sont mes options
- la carte des ressources de la sous-classe à la manette de la super-classe en
routes.rb
(et j'espère que je n'avez pas besoin d'appeler form_for sur toutes les sous-classes) - Remplacer les rails internes des méthodes pour rendre les classes mentir les uns aux autres
- Modifier tous les cas, dans le code où le chemin d'accès à un objet de l'action est appelée implicitement ou explicitement, soit de modifier le chemin d'accès ou de conversion de type de l'objet.
Avec toutes ces réponses conflictuelles, j'ai besoin d'une décision. Il me semble qu'il y est pas de bonne réponse. Est-ce un défaut dans les rails de conception"? Si oui, est-ce un bug qui peut obtenir fixe? Ou si non, alors j'espère que quelqu'un pourra m'a tout droit sur cet, me promener à travers les avantages et les inconvénients de chaque option (ou d'expliquer pourquoi ce n'est pas une option), et que l'on est la bonne réponse, et pourquoi. Ou est-il un droit de réponse que je ne suis pas à trouver sur le web?