You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构Rails中根据params参数分支的相似搜索表单视图

Rails搜索表单冗余代码重构方案

核心思路是提前提取可变参数,复用公共结构,无需拆分多个局部模板即可大幅减少重复代码:

重构步骤

  • 第一步:提前计算表单提交地址,根据params参数判断最终的form提交路径,仅写一次form_tag结构
  • 第二步:定义不同场景下的表单项配置,包括字段类型、列宽、可选参数等,统一遍历渲染所有表单项
  • 第三步:公共的字段属性(如class、默认占位符)统一配置,避免重复编写相同代码

重构后完整代码

# _search.html.slim
.search.text-center.my-5
  .container
    - # 提前计算表单提交路径与对应表单项配置
    - if params[:city_slug]
      - form_url = city_jobs_path(city_slug: params[:city_slug])
      - form_fields = [
          [:search, 'col-md-8', {placeholder: 'Find a job (name, company, position)'}],
          [:salary, 'col-md-2', {}]
        ]
    - elsif params[:industry_slug]
      - form_url = industry_jobs_path(industry_slug: params[:industry_slug])
      - form_fields = [
          [:search, 'col-md-8', {placeholder: 'Find a job (name, company, position)'}],
          [:salary, 'col-md-2', {}]
        ]
    - else
      - form_url = jobs_path
      - form_fields = [
          [:search, 'col-md-4', {placeholder: 'Find a job (name, company, position)'}],
          [:city, 'col-md-2', {options: @city_slug_list, include_blank: 'Select city'}],
          [:industry, 'col-md-2', {options: @industry_slug_list, include_blank: 'Select industry'}],
          [:salary, 'col-md-2', {include_blank: 'Select salary'}]
        ]

    = form_tag(form_url, method: :get, class: "form-inline") do
      .row
        - # 遍历渲染所有表单项,公共属性自动合并
        - form_fields.each do |field_name, col_class, opts|
          .mb-md-0.no-padding class=col_class
            - if field_name == :search
              = search_field_tag field_name, params[field_name], opts.reverse_merge(class: 'form-control rounded-left no-border-radius bg-light h-100')
            - elsif field_name == :salary
              = select_tag field_name, options_for_select(@salary_range.collect {|s| [vnd_format(s), s]}, params[field_name]), opts.reverse_merge(class: "form-select bg-light h-100")
            - else
              = select_tag field_name, options_for_select(opts.delete(:options), params[field_name]), opts.reverse_merge(class: "form-select bg-light h-100")
        - # 统一渲染提交按钮,仅编写一次
        .col-md-2.mb-md-0.no-padding
          = submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info"

注意:原代码中industry下拉的include_blank错误写为"Select city",重构时已修正为"Select industry"。

后续如果需要新增表单项、新增场景,仅需要修改上方的form_fields配置即可,不需要重复复制整个表单结构,维护成本大幅降低。

内容的提问来源于stack exchange,提问作者Hà Mai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:36:10