2010-02-03 10 views
9

He buscado y probado mucho, pero no puedo lograrlo como quiero ... así que aquí está mi problema.Usando campos de una asociación (has_muy) modelo con formtastic en rails

class Moving < ActiveRecord::Base 
    has_many :movingresources, :dependent => :destroy 
    has_many :resources, :through => :movingresources 
end 

class Movingresource < ActiveRecord::Base 
    belongs_to :moving 
    belongs_to :resource 
end 

class Resource < ActiveRecord::Base 
    has_many :movingresources 
    has_many :movings, :through => :movingresources 
end 

Movingresources contiene campos adicionales, como quantity. Estamos trabajando en las vistas para 'factura'. Gracias a Formtastic para simplificar todo el asunto relación con sólo escribir

<%= form.input :workers, :as => :check_boxes %> 

y me da una verdadera lista de casilla agradable. Pero lo que no he descubierto hasta ahora es: ¿Cómo puedo usar los campos adicionales de 'movingresource', al lado o debajo de cada casilla de verificación los campos deseados de ese modelo?

Vi diferentes enfoques, principalmente con el bucle manual a través de una matriz de objetos y la creación de las formas apropiadas, utilizando: para en una parte form.inputs, o no. Pero ninguna de esas soluciones estaba limpia (por ejemplo, se trabajó para la vista de edición pero no para nueva porque los objetos requeridos no se generaron o generaron y generarlos causó un desastre).

¡Quiero saber sus soluciones para esto!

Respuesta

8

De acuerdo, me perdí la revolución de accept_nested_attributes_for, esto explica por qué no funciona realmente.

Esto me tiene un gran paso adelante, pero creo que en algún lugar todavía voy a tener algunas complicaciones con mis relaciones complejas^_^

class Moving < ActiveRecord::Base 
    has_many :movingworkers, :dependent => :destroy 
    has_many :workers, :through => :movingworkers 
    accepts_nested_attributes_for :movingworkers 
end 


<% form.inputs :for => :movingworkers do |movingworker| %> 
    <%= movingworker.inputs :worker, :quantity %> 
<% end %> 
+1

Tenga en cuenta que se puede acceder directamente al modelo real subyacente a través del generador de formularios, por lo tanto: 'movingworker.object'. Consulte la línea 1244 en action_view/helpers/form_helper.rb: 'attr_accessor: object_name,: object,: options' –

+0

tiene razón. Muchas cosas han cambiado y aprendí muchas cosas nuevas, esto ahora es obvio para mí, pero debería mencionarse. – pduersteler

1

Si los campos no existen en la nueva vista, puede simplemente probar si es nuevo (new_record?) y presentar un conjunto diferente de campos (si lo envuelve en un parcial puede ser bastante limpio enfoque).

+0

gracias, tienes razón. Pero como trabajo con rieles, estoy acostumbrado a la simplicidad, por lo tanto, estoy pidiendo otras soluciones para elegir mi favorito. Y también creo que esto puede ayudar a otras personas. – pduersteler

4

de Formtastic: label_method opción podría ayudar. P.ej.

<%= form.input :movingworkers, :label_method => :worker %> 

o

<%= form.input :movingworkers, :label_method => Proc.new { |x| "#{x.worker} #{x.quantity}" } %> 
Cuestiones relacionadas