Rails编辑表单提交时HTTP方法显示POST却触发PATCH请求调用update动作的疑问
Rails编辑表单提交时HTTP方法显示POST却触发PATCH请求调用update动作的疑问
嗨,这个问题其实是Rails的一个经典小机制,我来给你掰扯清楚~
首先得说浏览器的原生限制:现代浏览器本身只支持GET和POST两种HTTP方法,像PUT、PATCH、DELETE这些RESTful风格的方法,浏览器是没法直接发送的。但Rails又要遵循REST规范,所以它搞了个巧妙的小技巧来绕开这个限制。
当你用Rails内置的表单助手(比如form_with或者旧版的form_for)生成编辑表单时,它会自动在表单里插入一个隐藏字段,代码大概长这样:
<input type="hidden" name="_method" value="patch">
接下来就是关键的流程了:
- 你提交表单时,浏览器确实发送的是POST请求,所以你在开发者工具里看到的是POST方法
- 但这个
_method隐藏字段会被Rails的ActionDispatch::MethodOverride中间件捕捉到,这个中间件会把请求的实际HTTP方法替换成字段里的patch值 - 所以到了Rails后端处理的时候,就会把这个请求当作PATCH请求来路由,自然就匹配到了
ProjectsController#update动作,这也是你在终端里看到Started PATCH "/projects/4"的原因
简单来说,浏览器发的是POST,但Rails通过隐藏字段“伪装”成了PATCH,以此来适配RESTful路由的设计~
内容来源于stack exchange
相关产品推荐
相关产品推荐

