2011-08-22 14 views
6

Tengo atributos anidados en mi show.erb y creo un atributo anidado en blanco y muestro una grilla de elementos con el espacio en blanco en la parte inferior como tal.Agregando un enlace de eliminación para atributos anidados

<%= form_for @question do |q| %> 
    <% q.fields_for :answers, @question.answers do |l| %> 
    <tr> 

     <td><%= l.text_field :text %></td> 
     <td><%= l.check_box :correct %></td> 
     <td><%= l.text_field :imagename %></td> 
     <td><%= l.number_field :x %></td> 
     <td><%= l.number_field :y %></td> 
    </tr> 
    <% end %> 

    <tr> 
     <td colspan=5 align=right><%= submit_tag '+' %> 
    </tr> 

<% end %> 

Quiero un link_to 'destruir' a trabajar, pero me estoy haciendo undefined method 'plural' cuando agrego esto a la red

<%= link_to 'Destroy', l, :controller => "answer", :confirm => 'Are you sure?', :method => :delete %> 

Respuesta

21

¿Por qué desea utilizar un enlace? También puede usar la funcionalidad de destrucción en los atributos anidados.

Todo lo que necesita hacer es añadir :allow_destroy => true en su definición accepts_nested_attributes y añadir

<%= l.check_box '_destroy' %> 

a cada registro. De esta forma, elimina todos los registros anidados con la casilla marcada al guardar el registro.

1

La variable que está utilizando l no es correcto. Cuando cede desde un bloque fields_for, el objeto de bloque es una instancia de FormBuilder que no es una instancia del objeto en sí. ¿Qué url quieres que indique el enlace? ¿Es Answers#destroy? ¿Qué identificación desea enviar a esta acción para que identifique qué destruir? Un link_to no es un elemento de formulario. Es solo un ayudante para una etiqueta de anclaje. Necesitas una URL, no un creador de formularios para construir ese enlace.

¿Va a ser una lista de formularios de respuesta? Uno para cada respuesta? Si es así, es posible que desee recorrerlos en lugar de simplemente usar fields_for.

Esperamos que esto lo ayude a seguir el camino correcto.

+0

sí, soy un idiota por no pasar el modelo en lugar del constructor de la forma –

9

Para aquellos encontrar esto desde Google, mientras que técnicamente una casilla de verificación de eliminación puede ser el camino correcto, creo que es confuso - la única ventaja es que requiere dos clics para eliminar (caja de selección y pulsa actualización). Tal vez sea mejor asegurarse de que la eliminación sea clara de lo que está sucediendo, y posiblemente agregar una forma fácil de recuperarla.

Lo siguiente es enviar la actualización al servidor como ajax, para gestionar la actualización de la página en un archivo callback o js view. Eliminar control remoto: verdadero y funcionará como un enlace normal.

# For my form I build a new object if it's missing, 
# so I need to check that this is not a new nested attribute. 
- unless question.answers.new_record? 
    # Basically, I am sending over the fields that would be sent 
    # by the _delete check box form being updated. 
    = link_to "Delete", question_path(question.id, question: { answers_attributes: { id: question.answers.id, "_destroy" => true }}), remote: true, confirm: "Really delete?", method: :put 
+1

Sí esto funciona bien en una relación has_many. Además, para obtener un cuadro de confirmación puede agregar ', data: {confirm: '¿Seguro?' } 'justo después del' método:: put' Lo único que noté (al menos en mi caso) fue que el elemento se eliminó pero la página no se recargó automáticamente. – 8bithero

+0

Gracias por la confirmación de has_many (no tengo idea de por qué no funcionaría). También se agregaron algunas notas de su comentario sobre la confirmación, y si elimina el control remoto: verdadero, debería funcionar como un enlace normal y actualizar la página; de lo contrario, debe manejarlo usted mismo. – d3vkit

+0

Estoy de acuerdo, el UX es realmente extraño con una casilla de verificación Eliminar – Dex

Cuestiones relacionadas