Rails 3 - удаление нескольких записей с использованием флажков

Как удалить несколько записей, используя флажки в Rails 3?

Ответ 1

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

Ответ 2

Предполагая, что вы хотите отобразить список записей в таблице, каждый из которых имеет флажок, и кнопку удаления, которая приведет к удалению всех отмеченных записей.

Во-первых, вам нужно создать имена для флажков, содержащих идентификатор записи, вы можете сделать это:

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

Это создаст HTML, который будет содержать следующие

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

Поэтому, когда вы публикуете форму, если вы отметили поле для записей с идентификаторами 1001 и 1002, ваше сообщение будет содержать:

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

Итак, внутри вашего контроллера вы можете сделать это

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

Ответ 3

Отправить идентификаторы всех элементов, находящихся на контроллере. Я предполагаю, что у вас будут удаляться идентификаторы для удаления для класса Foo, подлежащего удалению.

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

или

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

Используйте destroy, не используйте delete, если у вас есть какие-либо зависимости.