Ruby on Rails中如何将collection_select选中值传至控制器
解决Ruby on Rails中collection_select选中值传递为命名参数的问题
你现在的问题是collection_select选中值无法动态更新到Execute链接的submod参数里——因为link_to是服务器渲染时生成的静态URL,需要用JS动态修改链接参数来实现需求,按以下步骤修改即可:
1. 给执行链接添加ID标识
修改局部视图里的link_to,加上id属性方便JS定位元素:
<% @modName = locals[:moduleName] %> <% @id = locals[:id] %> <%= form_with url: admin_command_path() do |f| %> <%= collection_select(@refcode, :Code, Command.where(FLD: @modName), :Code, :Definition, {prompt: true}, {:onchange => "updateSubMod(this.value)"}) %> <br /><br /> <button class="btn_new"> <%= link_to "Execute", new_admin_command_path(mod: @modName, submod: @refcode, id: @id), id: "execute-link" %> </button> <% end %>
2. 改写JS函数动态更新链接参数
修改updateSubMod函数,利用URL API更新submod参数值:
<script> function updateSubMod(Code) { const executeLink = document.getElementById('execute-link'); const url = new URL(executeLink.href); // 将submod参数替换为当前选中的Code值 url.searchParams.set('submod', Code); // 把更新后的URL赋值回链接 executeLink.href = url.toString(); } </script>
原理说明
- 页面渲染时,
link_to生成的是固定URL,携带的是初始的submod值(即@refcode) - 当
collection_select选中值变化时,JS通过URL对象解析当前链接,修改查询参数中的submod为最新选中值 - 点击
Execute按钮时,跳转的URL就会携带实时选中的submod参数传给控制器
内容的提问来源于stack exchange,提问作者Sean Gillespie
相关产品推荐
相关产品推荐

