据我了解,HTML不支持HTTP动词“ DELETE”,因此制作删除表单时需要使用不同的路由。
如果是这种情况,为什么这段代码可以正常工作,
<%=button_to 'Delete', {:controller => :users, :action => 'destroy', :id => user.id}, :method => :delete%>
但是,以下代码无效
<%=button_to 'Delete', {:controller => :users, :action => 'destroy', :id => user.id}%>
并给出错误:
'No route matches [POST] "users/1/"'
该网址应解析为users/destroy/1
吗?
答案 0 :(得分:1)
听起来像不需要代码答案,因为您已经有了一个有效的版本。 Rails在幕后做了很多工作,因此除非您进行检查,否则很难知道浏览器中到底发生了什么。
DELETE可能无法用作HTML <form>
标记中的属性,但是它仍然是有效的HTTP请求。
Are the PUT, DELETE, HEAD, etc methods available in most web browsers?
What is the usefulness of PUT and DELETE HTTP request methods?
答案 1 :(得分:1)
HTML的较早版本仅支持GET
和POST
。较新的版本包括PUT
,PATCH
和DELETE
,所有主要的Web浏览器都将其视为XHR(XMLHttpRequest)
请求或简单的AJAX
请求。
发出对 PUT或PATCH或DELETE 的请求后,Rails在后台借助Javascript将这些请求作为对客户端的XHR
请求进行处理。当您的应用程序中的Javascript无法运行或被禁用时,这些请求将退回到GET
现在返回不起作用的代码段。你有下面的
<%= button_to 'Delete', {:controller => :users, :action => 'destroy', :id => user.id}%>
默认情况下, button_to
创建一个 form 并以POST
的形式发送请求,除非您显式覆盖它,如在第一种情况下使用{{ 1}}。因此,以上代码段生成的网址类似:method => :delete
,但生成的网址为users/1/
,由于您在POST
中没有定义任何这样的路由,最终失败了
该网址应该解析为users / destroy / 1吗?
否,当您在代码中使用routes.rb
时,生成的URL将是:method => :delete
,但请求将以users/1
的形式发送,由于它是根据您在DELETE
答案 2 :(得分:0)
Rails习惯在链接中提及方法(HTTP谓词),因此Rails知道要调用哪个控制器方法,因为如果没有HTTP谓词3动作显示,更新和销毁,所有这3个动作都会生成相同的url。 "/users/:id"
的路径(如果控制器是“ UsersController”)。为了进一步阅读,我建议看看:
https://guides.rubyonrails.org/routing.html#crud-verbs-and-actions
编辑:
如屏幕截图所示,如果将HTTP Verb设置为DELETE,Rails将自动知道它必须运行destroy操作,否则show,update和destroy的路径是相同的。
答案 3 :(得分:0)
输入:method =>:delete指示Rails创建具有隐藏值的表单,然后将其用于模拟具有以下内容的表单功能
method="delete"
如果有人能够解释为什么删除:action => :destroy
导致:id => user.id
被视为url中的键和值(即users?id=1
而不是users/1
),我会很感激的。