2012-10-03 23 views

Respuesta

33

routes.rb:

resources :blog_posts do 
    collection do 
     delete 'destroy_multiple' 
    end 
    end 

index.html.erb:

<%= form_tag destroy_multiple_blog_posts_path, method: :delete do %> 
<table> 
... 
<td><%= check_box_tag "blog_posts[]", blog_post.id %></td> 
... 
</table> 
<%= submit_tag "Delete selected" %> 
<% end %> 

blog_posts_controller.rb:

def destroy_multiple 

    BlogPost.destroy(params[:blog_posts]) 

    respond_to do |format| 
    format.html { redirect_to blog_posts_path } 
    format.json { head :no_content } 
    end 

end 
+0

Si BlogPost pertenecía a una Colección, ¿cómo funcionaría? Ejemplo:/collection/1/blogpost/1 – dngoo

+2

Gracias. Usando Rails 4, tuve que poner splat antes de params, como '* params [: blog_posts]', de lo contrario arrojaría un error: 'ActiveRecord :: AssociationTypeMismatch: BlogPost (# - 580055888) esperado, obtuvo String (# - 603015658) ' –

+0

Esta es una gran respuesta. ¿Sabes cómo podría agregar validación para garantizar que un usuario haya seleccionado una casilla de verificación cuando hacen clic en el botón Eliminar? –

1

Envía los identificadores de todos los elementos marcados en el controlador. Estoy asumiendo que u tiene enviar identificadores de ser eliminados de la clase Foo a borrar

ids = params[:ids] 
Foo.where("id in (#{ids}")).destroy 

o

ids = params[:ids].split(",") 
Foo.where(id => ids).destroy 

Uso destruir, no utilice eliminar si tiene alguna dependencia.

+0

'.where (: id => (params [: blog_posts])). Des troy' me daría 'ArgumentError in BlogPostController # destroy_multiple \ número incorrecto de argumentos (0 para 1)'. – user202448

+0

ver las ediciones en mi respuesta. –

5

Suponiendo que desea mostrar una lista de registros en una tabla, cada uno con una casilla de verificación, y tiene un botón Eliminar que hará que se eliminen todos los registros marcados.

En primer lugar, usted tiene que crear nombres de las casillas de verificación que contienen el ID de registro, usted puede hacer esto:

<%= check_box_tag("delete[#{@thing.id}]",1) %> 

que va a crear HTML que incluirá la siguiente

<input id='delete[1000]' type='checkbox' value='1' name='delete[1000]'> 

Así que cuando usted publica un formulario, si ha marcado la casilla para los registros con los identificadores 1001 y 1002, su publicación contendrá:

"delete[1001]"=>"1" 
"delete[1002]"=>"1" 
Así

dentro de su controlador, usted puede hacer esto

params[:delete].each do |id| 
    Thing.find(id.to_i).destroy 
end 
+1

respuesta más fácil. – courtsimas

Cuestiones relacionadas