Rails框架中submit_tag的自定义name参数丢失是什么原因?
问题原因及解决方案
1. 表单通过JavaScript手动提交导致参数丢失
浏览器默认只有通过点击提交按钮原生触发表单提交时,才会自动带上该按钮的name和value参数。如果你的表单绑定了提交事件,是通过JS调用form.submit()或者类jQuery的$('form').trigger('submit')手动触发提交,提交按钮的参数不会被自动携带。
解决方案:
- 方案一:添加隐藏域存储标记,修改提交逻辑
先在表单内新增隐藏域:
给你的提交按钮添加点击事件,点击时修改隐藏域的值:<%= hidden_field_tag :fast, 0, id: 'fast_flag' %>
控制器判断逻辑可以优化为更符合Rails规范的写法:document.querySelector('.add-basket-now').addEventListener('click', function() { document.getElementById('fast_flag').value = 1 })if params[:fast].to_i == 1 redirect_to checkout_path end - 方案二:修改JS提交逻辑,点击按钮时通过原生
click()触发提交,不要手动调用表单的submit()方法。
2. 提交按钮不在表单结构内部
如果你的submit_tag写在了form_tag/form_with的闭合标签之外,哪怕视觉上看起来属于表单,也不会被识别为表单的提交按钮,参数不会被携带。
解决方案:把submit_tag代码移动到表单标签的包裹范围内即可。
3. 表单序列化逻辑过滤了提交按钮参数
如果你是通过JS手动序列化表单参数再发起异步提交,大部分表单序列化工具默认会排除type="submit"类型的输入项,导致参数丢失。
解决方案:序列化参数时手动追加fast参数,或者使用上面提到的隐藏域方案。
前置排查步骤
可以先右键查看页面源码,确认生成的提交按钮HTML结构是否正确,预期应该是:
<input type="submit" name="fast" value="NOW!" class="add-basket-now" style="width: 160px;">
同时打开浏览器开发者工具的网络面板,点击按钮后查看提交的请求参数中是否包含fast,确认是前端提交时未携带还是后端被参数过滤逻辑丢弃。
内容的提问来源于stack exchange,提问作者cisco
相关产品推荐
相关产品推荐

