Rails 7使用Stripe时请求无法识别format.js如何解决
解决方案
问题根本原因:Rails 7 默认使用 Turbo 替代了旧版本的 Rails UJS,remote: true 发起的异步请求默认请求格式为 text/vnd.turbo-stream.html 而非 text/javascript,因此控制器无法匹配到 format.js 的响应逻辑,抛出 ActionController::UnknownFormat 错误。
以下是三种经过验证的可行方案:
方案1:最小改动适配原逻辑(保留format.js)
直接修改结账按钮的路径参数,显式指定请求格式为JS,即可触发控制器的format.js响应,其余代码无需改动:
<%= button_to 'Checkout', checkout_create_path(format: :js), method: :post, remote: true %>
方案2:适配Rails 7默认的Turbo规范
这是更符合Rails 7原生设计逻辑的方案:
- 修改控制器的响应逻辑:
respond_to do |format| format.turbo_stream end
- 将原
app/views/checkout/create.js.erb文件重命名为app/views/checkout/create.turbo_stream.erb,文件内的JS代码无需修改即可正常运行。
方案3:无需JS的最简实现(推荐)
Stripe Checkout Session 本身提供了直接跳转的URL,完全可以跳过前端JS跳转逻辑,无需处理异步请求格式问题:
- 移除按钮的
remote: true参数,改回普通同步请求:
<%= button_to 'Checkout', checkout_create_path, method: :post %>
- 替换控制器中的respond_to逻辑,直接重定向到Stripe结账页:
# 去掉原respond_to代码块,替换为下面的代码 redirect_to @session.url, allow_other_host: true
这个方案不需要任何前端JS处理,也不存在格式兼容问题,是最轻量的实现方式。
注意:如果选择方案1或2,你当前在application.html.erb的Stripe脚本引入配置已经满足运行要求,无需额外调整。
内容的提问来源于stack exchange,提问作者Samuel Da Costa
相关产品推荐
相关产品推荐

