【问题标题】:Add a 'destroyAll' action and route to my RESTful rails app添加“destroyAll”操作并路由到我的 RESTful rails 应用程序
【发布时间】:2015-02-03 13:13:40
【问题描述】:

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

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

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

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

请指导我如何向 destroyAll 操作添加路由以及如何在我的视图中使用它来创建使用该操作的链接。

在此先感谢

【问题讨论】:

  • 你有一个错误,@writing.each.destroy 错误并引发错误
  • 请问我应该用什么替换它?

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


【解决方案1】:

应该定义为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 命名约定。

【讨论】:

  • Marek 还有一件事,我的做法正确吗? @writing.each.destroy ?
  • 不。它将为 AR 收集错误(或类似)提供未定义的方法 destroy。为此,您可以使用destroy_all 方法:@writings = Writing.all@writings.destroy_all
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    resource :writings, only: :destroy
    

    问题在于,Rails 会将此操作映射到 WritingsController#destroy,因为 Rails 对单数资源使用复数控制器(无论如何,我们的任何单数资源都有复数名称),因此这将与 destroy 操作冲突对于个人著作。在这种情况下,您可以为此创建一个自定义控制器并在那里实现销毁操作:

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

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

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

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

    link_to 'delete all', writings_path, method: :delete
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多