Rails7下form_with搭配Stimulus、Hotwire的select事件不生效问题
问题原因
两处写法错误导致事件绑定失效:
- Rails的
form.select辅助方法参数顺序有严格要求:参数依次为字段名、选项列表、Rails表单配置哈希、HTML属性哈希。你写的data事件配置被传到了第三个「Rails表单配置」的位置,根本没有被渲染成select标签的HTML属性,change事件自然无法触发。 - 写了
data-action="click->answer#my_method"的p标签,放在了声明data-controller="answer"的div容器外面,不在Stimulus控制器的作用域范围内,点击事件也不会被识别。
修复代码
修正select标签参数
给form.select的第三个参数传空哈希占位,把包含data配置的HTML属性放到第四个参数位置:
<%= form.select :type_answer, [["Multiple Choice", 1], ["Single choice", 2], ["Text-box", 3]], {}, # 该位置传Rails原生配置,比如默认选中值、空白选项等,无配置就传空哈希 {data: { action: "change->answer#my_method" }} %>
调整p标签位置
如果需要p标签的点击事件生效,把它移到answer控制器的容器div内部:
<div data-controller="answer"> <div> <%= form.label :type_answer %> <%= form.select :type_answer, [["Multiple Choice", 1], ["Single choice", 2], ["Text-box", 3]], {}, {data: { action: "change->answer#my_method" }} %> </div> <p data-action="click->answer#my_method">Click me!!</p> </div>
校验方法
修改完成后刷新页面,右键检查生成的select标签,能看到标签上存在data-action="change->answer#my_method"属性即为渲染正确。此时切换下拉选项、点击p标签,都能在浏览器控制台看到输出的Hello new World日志。
内容的提问来源于stack exchange,提问作者Jorge Ortíz
相关产品推荐
相关产品推荐

