2012-10-03 8 views

Antwort

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

Wenn BlogPost zu einer Sammlung gehört, wie würde das funktionieren? Beispiel:/collection/1/blogpost/1 – dngoo

+2

Danke. Mit Rails 4 musste ich splat vor params setzen, wie '* params [: blog_posts]', sonst würde es einen Fehler werfen: 'ActiveRecord :: AssociationTypeMismatch: BlogPost (# - 580055888) erwartet, bekam String (# - 603015658) ' –

+0

Das ist eine wirklich gute Antwort. Wissen Sie, wie ich eine Validierung hinzufügen könnte, um sicherzustellen, dass ein Benutzer ein Kontrollkästchen aktiviert hat, wenn er auf die Schaltfläche zum Löschen klickt? –

1

Senden Sie die IDs aller geprüften Elemente an den Controller. Ich gehe davon aus u haben ids senden für Foo Klasse gelöscht werden, um

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

oder

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

Verwendung zerstören gelöscht werden, verwenden Sie keine löschen, wenn Sie irgendwelche Abhängigkeiten haben.

+0

'.where (: id => (params [: blog_posts])) .des troy 'würde mir' ArgumentError in BlogPostController # destroy_multiple \ falsche Anzahl von Argumenten geben (0 für 1) '. – user202448

+0

siehe Änderungen in meiner Antwort. –

5

Angenommen, Sie möchten eine Liste von Datensätzen in einer Tabelle mit jeweils einem Kontrollkästchen anzeigen und über eine Schaltfläche zum Löschen verfügen, mit der alle überprüften Datensätze gelöscht werden.

Zuerst müssen Sie Namen für die Kontrollkästchen erstellen, die den Datensatz-ID enthalten, könnten Sie dies tun:

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

Die HTML erstellen, die folgenden

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

So enthalten wird, wenn Wenn Sie das Formular für die Datensätze mit den IDs 1001 und 1002 aktiviert haben, enthält Ihr Beitrag:

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

So in Ihrem Controller, könnten Sie tun, um diese

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

einfachste Antwort. – courtsimas

Verwandte Themen