如何在Rails中不使用ERB实现删除按钮并添加DELETE请求方法
问题解答
不行,你不能直接给这个HTML按钮加<% method: :delete %>让它正常工作,原因和正确实现方式如下:
为什么直接加不行?
<% method: :delete %>本身不是合法的ERB语法,这种写法不会被Rails解析处理。- Rails里的
button_to生成的删除按钮,本质是通过表单+POST请求+_method隐藏字段来模拟DELETE请求的——因为浏览器原生只支持GET和POST方法,RESTful的DELETE/PUT等方法需要靠这种方式来实现,同时还需要携带CSRF令牌防止跨站请求伪造。你直接写的<a>标签默认是GET请求,没法触发Rails的DELETE路由逻辑。
正确的实现方式
方式1:用HTML表单模拟(和button_to原理一致)
直接写一个内联表单,带上_method隐藏字段和CSRF令牌,这样点击按钮会发送带DELETE标识的POST请求:
<form action="<%= @post %>" method="POST" class="d-inline"> <!-- 模拟DELETE请求的核心字段 --> <input type="hidden" name="_method" value="delete"> <!-- 必须的CSRF令牌,也可以用<%= form_authenticity_token %>直接生成值 --> <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>"> <button type="submit" class="btn btn-danger">Delete</button> </form>
加上class="d-inline"可以让表单和其他按钮/元素并排显示,符合你最初的需求。
方式2:结合Rails UJS用<a>标签
如果想用<a>标签实现,需要依赖Rails的UJS(或者Turbo Rails),通过data-method属性让JS帮你模拟DELETE请求:
<a href="<%= @post %>" class="btn btn-danger" data-method="delete" data-confirm="确定要删除吗?"> Delete </a>
注意:这种方式需要确保你的页面已经加载了Rails UJS(Rails 5+默认包含,或者通过Turbo实现),同时页面头部要有CSRF元标签(一般application.html.erb里会有<%= csrf_meta_tags %>)。
内容的提问来源于stack exchange,提问作者Caecilius-rgb
相关产品推荐
相关产品推荐

