【问题标题】:Populate checkbox from params从参数填充复选框
【发布时间】:2023-08-25 16:45:02
【问题描述】:

我的页面列出了路径并提供了基于文本的搜索 - 请在此处查看当前版本http://www.trailsee.com/trails。我正在添加一个表单来过滤搜索结果,例如按难度,活动,长度,允许狗等。我有过滤器工作,但它没有在用户可以选择多个项目的复选框字段中加载以前使用的参数,例如搜索后允许骑自行车,允许远足等。它目前只加载最大价值的参数。例如如果我有参数难度=0&difficulty=1&difficulty2,它只会加载选择难度2的页面。

特别是 :travel_type (radio)、:difficulty (checkbox)、:dogs (checkbox) 和 :action_types (checkbox) 有问题。

这是一个带有参数的示例 URL http://localhost:3000/trails?utf8=%E2%9C%93&travel_type=on&max_time=168&max_distance=35&difficulty=0&difficulty=1&difficulty=2&dogs=1&dogs=2&action_types=1&action_types=2&action_types=3&commit=Filter

重新加载时 选择了 travel_type 2 难度2被选中 狗 2 被选中 action_types 3 被选中

这是我用 slim 编写的视图代码

.page
  section.search
    .row
      form.form-inputs.columns.large-6.large-offset-1#search-form action=trails_path method='get'
        input type='search' placeholder='Search' name='query_string'
        button.button-search
          i.sprite-icon-search
  section.filter
    .row
      = form_tag nil, method: :get, class: 'form-inputs columns large-11 large-offset-1', id: 'trail-filter-form' do
        .estimate_time 
          strong Estimate time using
          ul
            li
              = radio_button_tag :travel_type, params[:travel_type], 0
              = label_tag 'Hiking'
            li
              = radio_button_tag :travel_type, params[:travel_type], 1
              = label_tag 'Running'
            li
              = radio_button_tag :travel_type, params[:travel_type], 2
              = label_tag 'Biking'
        div.max_time
          strong Max Time
          div.time
            p
              = '30m'
              = range_field_tag :max_time, params[:max_time], in: 30..240
              = '4+ hours'
            p
          strong Max Distance
          div.distance
            p
              = '1mi '
              = range_field_tag :max_distance, params[:max_distance], in: 1..50
              = '50+ mi'
        div.difficulty
          strong Difficulty
          div
          p
            = check_box_tag :difficulty, 0, params[:difficulty] == '0'
            = label_tag 
              i class='sprite-icon-difficulty-0'
            = check_box_tag :difficulty, 1, params[:difficulty] == '1'
            = label_tag 
              i class='sprite-icon-difficulty-1'
            = check_box_tag :difficulty, 2, params[:difficulty] == '2'
            = label_tag 
              i class='sprite-icon-difficulty-2'
          p
          strong Dogs
          div
            = check_box_tag :dogs, 0, params[:dogs] == '0'
            = label_tag 'Off Leash'
            = check_box_tag :dogs, 1, params[:dogs] == '1'
            = label_tag 'w/Leash'
            = check_box_tag :dogs, 2, params[:dogs] == '2'
            = label_tag 'Not Allowed'
        div.views
          strong Views
          div
            = check_box_tag :views, 1, params[:views] == '1'
            = label_tag 'Has Views'
          p
          strong Activities Allowed
          div
            = check_box_tag :action_types, 0, params[:action_types] == '0'
            = label_tag 
              i class='sprite-icon-horseback-med'
            = check_box_tag :action_types, 1, params[:action_types] == '1'
            = label_tag 
              i class='sprite-icon-ski-med'
            = check_box_tag :action_types, 2, params[:action_types] == '2'
            = label_tag 
              i class='sprite-icon-hiking-med'
            = check_box_tag :action_types, 3, params[:action_types] == '3'
            = label_tag 
              i class='sprite-icon-bike-med'
        = submit_tag 'Submit', value: 'Filter', class: 'button small right trail-filter'

  section.content#trails-find
    .row.find-trails-map
      .large-11.large-offset-1.columns
        .map#find-map
    = render 'trails/trail_list', locals: { decorated_trails: decorated_trails,
                                                 title: 'PUBLIC TRAILS' }

【问题讨论】:

    标签: ruby-on-rails checkbox params slim-lang


    【解决方案1】:

    您将使用&difficulty=0&difficulty=1&difficulty=2 覆盖您的 params[:difficulty] 变量,您必须为每个复选框指定一个唯一的 params 变量名称。

     div.difficulty
          strong Difficulty
          div
          p
            = check_box_tag :difficulty0, true, false 
            = label_tag 
              i class='sprite-icon-difficulty-0'
            = check_box_tag :difficulty1, true, false
            = label_tag 
              i class='sprite-icon-difficulty-1'
            = check_box_tag :difficulty2, true, false
            = label_tag 
              i class='sprite-icon-difficulty-2'
    

    【讨论】:

    • 谢谢!当我使用上面的代码时,默认在加载/重新加载时选中复选框。我想要的是让他们默认为未选中,但是当他们为过滤器填充他们的选择时,我希望它重新加载他们的选择。我更新时它也不会更改 URL 参数。难道还是难度=0&难度=1&难度=2。我将如何更改上面的内容来做到这一点?
    • 对不起!,我已经修复了上面的代码,以便 url 应该正确更新。另请查看apidock.com/rails/ActionView/Helpers/FormTagHelper/… 了解更多信息