在button_to中使用:method => delete的目的是什么?

时间:2018-10-20 21:02:34

标签: ruby-on-rails ruby url-routing web-development-server

据我了解,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吗?

4 个答案:

答案 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的较早版本仅支持GETPOST。较新的版本包括PUTPATCHDELETE,所有主要的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的路径是相同的。

enter image description here

答案 3 :(得分:0)

输入:method =>:delete指示Rails创建具有隐藏值的表单,然后将其用于模拟具有以下内容的表单功能

method="delete"

如果有人能够解释为什么删除:action => :destroy导致:id => user.id被视为url中的键和值(即users?id=1而不是users/1),我会很感激的。