Pregunta

Tengo muchos-a-muchos, la relación con un cuadro vínculo, y quiero tirar de los modelos juntos en una forma para que yo pueda actualizar desde la misma página.Realmente estoy luchando con la obtención de la check_box de mostrar todos los elementos de mi matriz - he rastreado la red y ha estado trabajando en esto, literalmente, todo el día, y me estoy dando cuenta que es difícil aplicar la información que estoy leyendo a mi problema.Yo también soy muy nuevo en RoR y he estado siguiendo un poco anticuado tutorial de vídeo (pre 2.0) así que pido disculpas por mi código.Hasta ahora, lo tengo a la salida de sólo un par de claves en la matriz (la última) - aunque fuera de forma, el código utilizado en el tutorial funciona exactamente como debería.Eso es de poco uso, aunque!Host es el modelo para que el formulario principal, y la Facturación se encuentra fuera de la modelo que estoy tratando de agregar al formulario.

Este es el código que funciona fuera de la forma del tutorial:

<% for billing in @billings -%>
<%= check_box_tag('billing_title[]', billing.id, @host.billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end -%>

Sólo necesito saber cómo hacer que funcione dentro de la forma.Este es el mencionado código que sólo se recupera el pasado de la matriz de par de claves después de recorrer a través de ellos:

<% f.fields_for :billings do |obj| %><br />
<%= check_box_tag('billing_title[]', billing.id, @billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end %>

La depuración(@billings) :

--- 
- !ruby/object:Billing 
attributes: 
title: Every Month
id: "1"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 12 Months
id: "2"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 6 Months
id: "5"
attributes_cache: {}

Cualquier ayuda muy apreciada.

¿Fue útil?

Solución

Craig, parece que lo que busca es accepts_nested_attributes_for que es una mejor manera de manejar la mayor parte de los modelos anidados en un formulario.

En lugar de robar todo el trabajo de Ryan y volver a publicar aquí, voy a darle un enlace a su screencast:

http://railscasts.com/episodes/196-nested -Modelo-form-parte-1

Esto se basa fuera de su serie de formas complejas.

Usted debe ser capaz de taylor este tutorial para lo que está tratando de hacer, pero si no, estaría feliz de ayuda.

EDIT:

Muy bien, después de ver su código, hay algunas cosas causando problemas. :)

En primer lugar, con las asociaciones, que no es necesario tirar de una colección adicional para la facturación, es decir:.

@host = Host.find(params[:id])
@voips = Voip.find(:all)
@custsupps = Custsupp.find(:all)
@payments = Payment.find(:all)
@billings = Billing.find(:all) # <-- This is not needed and causing your problems

La configuración de la asociación en el modelo hace todo esto para usted. Esto es parte de la magia de los carriles. : D

Ahora bien, es importante tener en cuenta que al utilizar asociaciones que necesita para asegurarse de que los objetos están efectivamente asociadas. En otras palabras, si usted tiene 3 Billings objetos en su base de datos y que no está asociado con el objeto host, no van a aparecer en el formulario.

Si usted está tratando de asociar una facturación a un host mediante una casilla de verificación que se va a querer tomar un enfoque diferente, debido a que su forma con sólo Billings visualización ya se asocia con su anfitrión.

Si su tratando de editar o modificar Billings existentes que están asociados a la anfitriona, donde la casilla representa un atributo de 'pagado' (un booleano), por ejemplo, a continuación, este enfoque está muy bien y el código del formulario se vería algo como esto :

<% f.fields_for :billings do |b| %><br />
  <%= b.check_box :paid %> <%= b.title %>
<% end %>

Así que tal vez aclarar lo que su tratando de lograr desde un punto de vista funcionalidad y podemos encontrar una mejor solución.

Otros consejos

No estoy seguro de mi respuesta, pero voy a tratar ...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>

A mí me parece que es un problema con los bucles...

En el ejemplo de código, se recorre la @billings (una matriz de las facturas de los objetos pasados de su controlador), y llamar a la actual billing.

En el código del formulario, se recorre la :billings (símbolo hace referencia a la billings ActiveRecords) y llamando a la actual obj.Luego, de manera confusa, su código de re-utiliza el nombre de la variable obj de nuevo en el @billings.recoger función...pero esto debe tener locales de ámbito privado y no el efecto de su bucle principal, pero es difícil de interpretar en la vista.

De todos modos, ya que las cosas dentro de su forma de bucle no de referencia obj, es el uso de la variable billing- que no cambia cuando el bucle a través de, pero mantiene el último valor que tenía:el último elemento del bucle anterior!Esto explica por qué sólo ver la última etiqueta.(También, la debug(@billings) la función hace su propio bucle a través de los registros de clases-que no está dentro de la fields_for bucle do.)

Me gustaría empezar con el cambio de la primera línea de su código de formulario para volver a utilizar el nombre de la variable billing de nuevo, como este:

<% f.fields_for :billings do |billing| %><br />

Ruby bloque de sintaxis puede ser bastante confuso al principio--o, simplemente, cada vez que usted está leyendo el código que no te escribo ... pero cuando se rompe todo a los componentes básicos, que usualmente es sólo un bucle a través de un conjunto de elementos y la realización de alguna función en cada uno de ellos.También mirar hacia fuera para la confusión entre apariencia similar nombres:@facturación, @facturación :facturación y facturación de todas las cosas diferentes a Ruby y Rails.Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top