我想添加一个destroyAll动作来销毁我正在写的博客应用中的所有帖子。我有我的routes.rb像这样:
Rails.application.routes.draw do
resources :writings
root "writings#index"
end
在我的控制器中,我想添加以下操作:
def destroyAll
@writing = Writing.all
@writing.each.destroy
end
请指导我如何添加一个路径到destroyAll动作,以及如何在我的视图中使用它来建立一个链接来使用该动作。
非常感谢
答案 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
冲突。
您甚至可以为集合资源命名一个有意义的代表集合概念的东西。