with text_field tag rails form_with form_tag form for ruby-on-rails-3 controller single-table-inheritance

ruby-on-rails-3 - text_field - select tag rails



Controlador Ășnico, clases mĂșltiples(heredadas)(rieles 3) (1)

Tengo una clase base heredada por otros 2 a través de la herencia de tabla única. Quiero que todas las subclases compartan el mismo controlador / vistas por varias razones: la única diferencia real está en la funcionalidad del modelo.

Sin embargo, cuando trato de usar link_to "stuff", instance_of_child recibo quejas sobre no poder encontrar la página correcta.

Intenté meterme con match ''/ subclass'' => redirigir (''/ parent'') pero eso produce enlaces extraños que no tienen sentido. ¿Alguna sugerencia? Soy bastante nuevo en los rieles, y admito que mi comprensión de routes.rb es aún limitada, sin embargo, no estoy del todo seguro de que sea donde debería estar mirando.


De http://www.alexreisner.com/code/single-table-inheritance-in-rails :

Si alguna vez ha intentado agregar STI a una aplicación Rails existente, probablemente sepa que muchos de sus métodos link_to y form_for arrojan errores cuando agrega una clase principal. Esto se debe a que ActionPack examina la clase de un objeto para determinar su ruta y URL, y no ha mapeado rutas para sus nuevas subclases. Puede agregar las rutas como tal, aunque no lo recomiendo:

# NOT recommended: map.resources :cars, :as => :vehicles, :controller => :vehicles map.resources :trucks, :as => :vehicles, :controller => :vehicles map.resources :motorcycles, :as => :vehicles, :controller => :vehicles

Esto solo alivia un síntoma particular. Si usamos form_for, nuestros campos de formulario todavía no tendrán los nombres que esperamos (por ejemplo: params [: car] [: color] en lugar de params [: vehicle] [: color]). En cambio, debemos atacar la raíz del problema implementando el método model_name en nuestra clase principal. No he visto ninguna documentación para esta técnica, así que esto no es oficial, pero tiene sentido y funciona perfectamente para mí en Rails 2.3 y 3:

def self.inherited(child) child.instance_eval do def model_name Vehicle.model_name end end super end

Esto probablemente parece confuso, así que déjame explicarte:

Cuando llamas a un método generador de URL (por ejemplo: link_to ("car", car)), ActionPack llama a model_name en la clase del objeto dado (aquí car). Esto devuelve un tipo especial de cadena que determina a qué se llama el objeto en las URL. Todo lo que hacemos aquí es anular el método model_name para las subclases de Vehicle para que ActionPack vea las subclases de Auto, Truck y Motorcycle como pertenecientes a la clase padre (Vehicle), y así usar las rutas nombradas de la clase padre (VehiclesController) dondequiera que estén las URL generado. Todo esto supone que está utilizando URL de recursos de recursos de Rails (RESTful). (Si no es así, por favor)

Para investigar la invocación del nombre del modelo usted mismo, consulte el código fuente de Rails para el método ActionController :: RecordIdentifier # model_name_from_record_or_class. En Rails 2.3 la cadena especial es una instancia de ActiveSupport :: ModelName, en Rails 3 es un ActiveModel :: Name