6

Estoy haciendo un sistema de informes para mi aplicación. Creé un modelo ReportKind por ejemplo, pero como puedo informar muchas cosas, quería crear diferentes grupos de tipos de informes. Dado que comparten mucho comportamiento, estoy tratando de usar la herencia.Rails Modelo de herencia en formularios

Así que tienen el modelo principal:

model ReportKind << ActiveRecord::Base 
end 

y creó por ejemplo:

model UserReportKind << ReportKind 
end 

En mis report_kinds mesa tengo la columna de tipo, y hasta aquí todo está trabajando. Mi problema está en los formularios/controladores.

Cuando hago un ReportKind.new, mi formulario es compilado con el prefijo '* report_kind *'. Si obtiene un UserReportKind, incluso a través de un , el formulario generará el prefijo 'user_report_kind'.

Esto ensucia todo en los controladores, ya que a veces tendré params [: report_kind], a veces params [: user_report_kind], y así sucesivamente para cada otra herencia que hice.

¿Hay alguna forma de obligarlo a usar el prefijo 'report_kind'? También tuve que forzar el atributo 'tipo' en el controlador, porque no obtuvo el valor directo del formulario, ¿hay alguna forma bonita de hacerlo?

El enrutamiento era otro problema, ya que intentaba crear rutas basadas en los nombres heredados de los modelos. Lo supero agregando los otros modelos en rutas que apuntan al mismo controlador.

Respuesta

6

Este tipo de herencia siempre es complicado. Afortunadamente, los problemas que mencionas son todos solucionables.

En primer lugar, puede forzar formas de usar los nombres y las direcciones URL de los atributos específicos de esta manera:

<%= form_for :report_kind, @report_kind, :url => report_kind_path(@report_kind) %> 

Esto obligará a todos los parametros para @report_kind estar en params [: report_kind] independientemente de si es un @report_kind UserReportKind o no. Además, todas las solicitudes de publicación y envío se enviarán también a ReportKindsController.

En segundo lugar, se puede especificar el tipo con un atributo oculto de esta manera:

<%= form.hidden_field :type, 'UserReportKind' %> 

Por último, para las rutas, yo haría lo siguiente:

map.resources :user_report_kinds, :controller => :report_kinds 

Esto significa que cualquier URL como/user_report_kinds/... en realidad usará ReportKindsController.

+0

<% = form.hidden_field: type,: value => 'UserReportKind'%> Funcionó para mí. – cider

Cuestiones relacionadas