Rails使用Elastic Search/Searchkick aggs时form.select循环失效问题
问题原因分析
- 你对
form.select表单助手的使用方式完全不符合Rails API规范,是导致遍历不执行的核心原因 - 其次ERB标签缺失
=,即便参数正确也不会把组件渲染到页面上
具体错误点拆解
form.select的参数规则错误form.select作为Rails内置表单助手,标准调用格式为:
<%= form.select(属性名, 选项数组, 可选配置项, HTML属性) %>
你直接把@jobs.aggs["location"]["buckets"].each作为第一个参数传入,form.select无法识别该参数类型,自然不会执行后续的遍历块。
ERB标签未加输出标记
你使用<% form.select %>而非<%= form.select %>,前者仅执行Ruby代码不会向页面输出任何内容,即便参数正确也看不到渲染结果。原生select标签的功能限制
你原有代码块中的link_to、<strong>标签无法在原生<select>的<option>中生效,浏览器原生下拉选项仅支持纯文本内容,若需要带样式、跳转逻辑的下拉选项,需自行实现模拟下拉组件。
正确实现方案
方案1:直接使用form.select快捷生成
先把聚合结果转换为form.select要求的选项数组格式即可:
<% # 预处理选项,格式为 [选项显示文本, 选项提交值] location_options = @jobs.aggs["location"]["buckets"].map do |bucket| [bucket["key"], bucket["key"]] end %> <!-- 参数说明::location是提交时的参数名,selected指定默认选中项 --> <%= form.select :location, location_options, { selected: params[:location] }, {} %>
方案2:手动渲染option(自定义程度更高)
如果需要对option做更多自定义配置,可以自己写select标签搭配循环:
<select name="location" id="job_location"> <% @jobs.aggs["location"]["buckets"].each do |bucket| %> <option value="<%= bucket["key"] %>" <%= 'selected' if params[:location] == bucket["key"].to_s %> > <%= bucket["key"] %> </option> <% end %> </select>
内容的提问来源于stack exchange,提问作者Cory Johnson
相关产品推荐
相关产品推荐

