Mis Rieles vistas y controladores están llenas redirect_to
, link_to
y form_for
las llamadas a métodos. A veces link_to
y redirect_to
son explícitos en las rutas que están vinculando (por ejemplo link_to 'New Person', new_person_path
), pero muchas veces las rutas son implícitas (por ejemplo link_to 'Show', person
).
Agrego algo de herencia de tabla única (STI) a mi modelo (por ejemplo Employee < Person
), y todos estos métodos se rompen para una instancia de la subclase (por ejemplo Employee
); cuando se ejecuta rails link_to @person
, se equivoca con undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails está buscando una ruta definida por el nombre de la clase del objeto, que es empleado. Estas rutas de empleados no están definidas y no hay un controlador de empleados, por lo que las acciones tampoco están definidas.
Esta pregunta se ha hecho antes:
- En StackOverflow , la respuesta es editar cada instancia de link_to, etc. en toda su base de código, y establecer explícitamente la ruta
- En StackOverflow nuevamente, dos personas sugieren usar
routes.rb
para asignar los recursos de la subclase a la clase padre (map.resources :employees, :controller => 'people'
). La respuesta principal en esa misma pregunta SO sugiere la conversión de tipos de cada objeto de instancia en la base de código usando.becomes
- Otro más en StackOverflow , la respuesta principal es en el campo Do Repeat Yourself, y sugiere crear andamios duplicados para cada subclase.
- Aquí está la misma pregunta nuevamente en SO, donde la respuesta principal parece estar mal (¡Rails magic Just Works!)
- En otra parte de la web, encontré esta publicación de blog donde F2Andy recomienda editar en la ruta en todas partes del código.
- En la publicación de blog Herencia de tabla única y rutas RESTful en Logical Reality Design, se recomienda asignar los recursos para la subclase al controlador de la superclase, como en la respuesta SO número 2 anterior.
- Alex Reisner tiene una publicación de herencia de tabla única en Rails , en la que defiende contra el mapeo de los recursos de las clases secundarias a la clase principal
routes.rb
, ya que eso solo detecta roturas de enrutamiento desdelink_to
yredirect_to
, pero no desdeform_for
. Por lo tanto, recomienda agregar un método a la clase principal para que las subclases mientan sobre su clase. Suena bien, pero su método me dio el errorundefined local variable or method `child' for #
.
Así que la respuesta que parece más elegante y tiene la mayor parte de consenso (pero no es todo lo que elegante, ni que tanto consenso), es el añadir los recursos a su routes.rb
. Excepto que esto no funciona form_for
. Necesito algo de claridad! Para destilar las opciones anteriores, mis opciones son
- asigne los recursos de la subclase al controlador de la superclase en
routes.rb
(y espero no tener que llamar a form_for en ninguna subclase) - Anular métodos internos de rieles para hacer que las clases se mientan entre sí
- Edite cada instancia en el código donde se invoca implícita o explícitamente la ruta a la acción de un objeto, ya sea cambiando la ruta o escribiendo el objeto.
Con todas estas respuestas en conflicto, necesito una decisión. Me parece que no hay una buena respuesta. ¿Es esto una falla en el diseño de los rieles? Si es así, ¿es un error que puede solucionarse? O si no, entonces espero que alguien pueda aclararme esto, guiarme a través de los pros y los contras de cada opción (o explicar por qué esa no es una opción), y cuál es la respuesta correcta y por qué. ¿O hay una respuesta correcta que no estoy encontrando en la web?