Ruby on Rails中如何在HTML select标签内使用link_to调用控制器
你原代码中在<option>标签内嵌套link_to生成链接的写法是无效的,浏览器不支持在下拉选项中嵌入可点击的超链接,以下是两种可直接落地的实现方案:
方案1:极简跳转方案(和现有link_to逻辑完全兼容)
直接把请求路径作为option的value,通过下拉框的change事件触发跳转,无需额外引入依赖,新手可直接复用:
<td scope="row"> <select class="form-select" onchange="if (this.value) window.location.href = this.value;"> <option value="<%= workspace_member_disposition_path(@workspace.id, guest, "undecided") %>" selected="selected">Undecided</option> <option value="<%= workspace_member_disposition_path(@workspace.id, guest, "should_delete") %>">Delete Member</option> <option value="<%= workspace_member_disposition_path(@workspace.id, guest, "make_member") %>">Convert Guest to Full Member</option> </select> </td>
如果你的项目是Rails 7+ 且开启了Turbo,想要实现无整页刷新的体验,把onchange属性里的window.location.href = this.value替换为Turbo.visit(this.value)即可。
方案2:表单提交方案(符合Rails安全规范)
修改数据的操作使用GET请求存在误触发风险(比如爬虫爬取链接时可能直接执行删除/转换操作),推荐用表单提交的POST/PUT请求实现:
<td scope="row"> <%= form_with url: workspace_member_disposition_path(@workspace.id, guest), method: :put do |form| %> <%= form.select :disposition, [["Undecided", "undecided"], ["Delete Member", "should_delete"], ["Convert Guest to Full Member", "make_member"]], selected: "undecided", class: "form-select", onchange: "this.form.requestSubmit()" %> <% end %> </td>
控制器侧可以通过params[:disposition]获取用户选中的操作类型,适配你原有逻辑即可。
内容的提问来源于stack exchange,提问作者TKG
相关产品推荐
相关产品推荐

