添加'destroyAll'操作并路由到我的RESTful rails应用程序

时间:2014-12-05 11:15:52

标签: ruby-on-rails ruby rest model-view-controller

我想添加一个destroyAll动作来销毁我正在写的博客应用中的所有帖子。我有我的routes.rb像这样:

Rails.application.routes.draw do
  resources :writings
  root "writings#index"
end

在我的控制器中,我想添加以下操作:

def destroyAll
  @writing = Writing.all
  @writing.each.destroy
end

请指导我如何添加一个路径到destroyAll动作,以及如何在我的视图中使用它来建立一个链接来使用该动作。

非常感谢

3 个答案:

答案 0 :(得分:2)

应将其定义为writings

的收集路线
resources :writings do
  collection do
    delete :destroy_all
  end
end

拥有它,您可以链接到delete_all这样的动作:

link_to 'delete all', [:destroy_all, :writings], method: :delete

你应该注意到我写了delete_all而不是deleteAll,因为前者坚持使用Ruby命名约定。

答案 1 :(得分:0)

我认为Marek Lipka的答案是完全足够的,但我想提供一个替代方案,IMFO有点多RESTful。我将所有writings的集合建模为一个单独的资源。由于此资源没有id,并且只能有一个此资源的实例,因此它必须是一个独特的资源:

resource :writings, only: :destroy

这个问题是,Rails会将此操作映射到WritingsController#destroy,因为Rails使用多个控制器来处理单个资源(无论我们的任何奇异资源都有多个名称),所以这会与{{ 1}}针对个人着作的行动。在这种情况下,您可以为此创建自定义控制器并在那里实施销毁操作:

destroy

或者您仍然可以使用旧控制器,但指定另一个操作:

resource :writings, only: :destroy, controller: 'collections/writings'

在这种情况下,您可以在视图中使用以下内容:

resource :writings, only: :destroy, action: :destroy_all

答案 2 :(得分:0)

参加聚会很晚,但想补充一点,也许另一种方式是将所有著作视为一种资源本身,因此您可以使控制器遵循基本的RESTful动作Rails通常使用。

resource :writings_collection, only: :destroy
# DELETE /writings_collection --> WritingsCollectionController#destroy

优点是路由助手不会与writings冲突。 您甚至可以为集合资源命名一个有意义的代表集合概念的东西。