为什么 delete_model_path 的标准助手不存在?

Why doesn't standard helper for delete_model_path exist?

例如,如果我有一个模型 Item,并且我为它定义了足智多谋的路线,我必须手动将 :delete 动作作为成员,这是为什么?

示例:

# .../config/routes.rb

resources :items do
  member { get :delete }
end

我需要 :delete 操作来向用户显示确认对话框。有没有更好的方法来完成我想做的事情?还是我做得对,这是最佳做法?

删除对象的标准操作称为destroy,是resources :items定义的七种路由之一。

您可以在示例中使用 link_to "Delete", item_path(@item), method: :delete 调用它。

切勿使用 GET 请求执行破坏性操作。

通常情况下,您使用不显眼的 js 显示确认对话框。像这样

<%= link_to 'Destroy', item_path(@item), method: :delete, data: {confirm: 'Are you sure?'} %>

这将生成一段 JS,拦截点击 link 并显示确认模式。如果您选择继续,它将发送表格。

是的,不要通过 GET 请求执行此类危险操作(除非您有正当理由)

I must include :delete action as a member by hand

不,你不需要。

查找 Rails' guide on resourceful routing 了解更多信息:

如其他答案中所述,您必须使用以下命令调用 destroy 路径助手:

<%= link_to "Destroy", items_destroy_path(@item), method: :delete %>

您还需要将 Rails UJS 附加到您的 JS 才能使其正常工作。

这是因为默认情况下您应该使用客户端 JS 显示确认对话框,如@SergioTulentsev 所述。 "delete confirmation" 有一个单独的页面并不常见,因此不是默认设置。

是的,您可能已经注意到某些操作的模式:newcreate 的 "interfacing stub",正如 editupdate , 他们默认不做任何事情,他们只向您发送界面以进行实际操作。

但是,操作本身是使用适当的 HTTP 动词(POSTDELETE 等)发布到资源路径,这几乎是每个人的建议。但是,重要的是要知道 links 只能做 GET(表单可以做其余的事情)。要制作 link 问题 DELETE,您必须使用 Rails' 帮助程序用 JavaScript 扩充它。大家都是这么建议的。如果 JavaScript 结果被禁用(如果你关心人类用户比例低得离谱),这将不起作用。

您将要执行的操作与 destroy 相同 "interfacing stub"。您可以将其命名为 delete 并相应地命名路由。 只是不常见,仅此而已。

不过,如果它 对您来说很常见,请考虑创建一个 路由关注点,甚至是您自己的助手。我已经看到在几乎没有用户界面的 API 中需要这样的东西,因此不需要来自默认助手的 newedit