如何重构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
相关产品推荐
相关产品推荐

