【问题标题】:Reset dropdown to selected value将下拉菜单重置为所选值
【发布时间】:2014-01-10 19:15:42
【问题描述】:

我有一个显示数据库中所有行程的索引页面。页面顶部是一个带有下拉列表的过滤器,您可以在其中选择类别、地区或两者来过滤结果。

当您选择您的选项并单击“显示”时,下拉菜单会返回到“所有类别”和“所有地区”的默认选项。

当我过滤结果时,如何才能让选定的选项显示在下拉列表中?

这是我的下拉菜单:

.row
  = form_tag all_road_trips_path, id: 'filter-trips-form', method: :get do
  .select-intro
    Browse
  .select-wrapper.trip-categories
    = collection_select(:category, :id, Category.all, :id, :name, :prompt => "All categories")
  .select-intro
    trips for
  .select-wrapper
    = collection_select(:region, :id, Region.all, :id, :name, :prompt => "All regions")
  .select-button
    = submit_tag 'Show Trips', class: 'button square'

编辑::

我尝试添加selected 值并得到一个'undefined method `[]' for nil:NilClass' 错误。我认为这是因为我的下拉列表的第一个值是“所有类别”,实际上并不是数据库中的对象,因此缺少 id。这是更新的代码和服务器输出:

.row
  = form_tag all_road_trips_path, id: 'filter-trips-form', method: :get do
  .select-intro
    Browse
  .select-wrapper.trip-categories
    = collection_select(:category, :id, Category.all, :id, :name, :prompt => "All categories", :selected => params[:category][:id])
  .select-intro
    trips for
  .select-wrapper.trip-regions
    = collection_select(:region, :id, Region.all, :id, :name, :prompt => "All regions", :selected => params[:region][:id])
  .select-button
    = submit_tag 'Show Trips', class: 'button square'

Started GET "/road-trips/all" for 127.0.0.1 at 2014-01-10 14:03:39 -0600
Processing by RoadTripsController#all as HTML
  Category Load (0.4ms)  SELECT "categories".* FROM "categories"
  Rendered road_trips/_trip_filter.html.haml (4.7ms)
  Rendered road_trips/all.html.haml within layouts/application (5.6ms)
Completed 500 Internal Server Error in 9ms
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1

NoMethodError - undefined method `[]' for nil:NilClass:
  app/views/road_trips/_trip_filter.html.haml:6:in `block in _app_views_road_trips__trip_filter_html_haml__2571960046883419269_70320079055780'
  haml (3.1.8) lib/haml/helpers/action_view_mods.rb:162:in `block (2 levels) in form_tag_with_haml'

【问题讨论】:

    标签: javascript jquery ruby-on-rails


    【解决方案1】:

    使用:selected 选项:

    = collection_select(:category, :id, Category.all, :id, :name, :prompt => "All categories", :selected => params[:category_id or however you store this value])
    

    在此处底部评论中简要讨论:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select

    发生了什么:通过将一个值传递给collection_select 表单助手的:selected 选项,您是在告诉它在值匹配时将其中一个选项标签标记为选中。例如,给定选项“苹果”、“香蕉”、“巧克力”:

    <select name="treat">
      <option value="apple">Apple</option>
      <option value="banana">Banana</option>
      <option value="chocolate">Chocolate</option>
    </select>
    

    当您将“巧克力”传递给collection_select 表单助手时,它会将值与选项标签的值匹配,并将匹配的标签标记为选中:

    = collection_select :treat, args..., :selected => 'chocolate'
    # will render:
    <select name="treat">
      <option value="apple">Apple</option>
      <option value="banana">Banana</option>
      <option value="chocolate" selected>Chocolate</option>
    </select>
    

    希望对您有所帮助。

    编辑: 您错误地调用了 params 值,而不是:

    params[:category][:id]
    

    应该是:

    params[:category_id]
    

    这也适用于其他参数。

    这是因为表单助手:collection_select :category, :id 将生成一个名为 category_id 的选择标记,这将是提交的参数。

    no method [] for nilClass 错误是由 params[:category] 返回 nil 引起的,因为没有这样的参数。

    【讨论】:

    • 很好的解释。唯一的问题是第一个提示“所有类别”或“所有区域”不是数据库中的类别或区域,因此它没有 id。因此,当我尝试加载页面时,我得到一个用于 nil:NilClass 的“未定义方法 `[]”。但是,如果已经进行了选择,那么它可以正常加载并按照您的说明工作。谢谢。
    • 这不是导致该错误的原因。 :prompt 和 :selected 可以很好地协同工作,即使其中一个提示选项没有任何价值。如果您愿意,您可以发布导致该问题的视图代码以及错误和回溯的前几行
    • 修复了 nomethod 错误,但现在在下拉菜单中选择的选项在重新加载时无法成为所选项目。不过,我感谢您的帮助。
    • 您可以尝试检查 params[:category_id] 的值,然后与您呈现的 HTML 选择标签进行交叉检查,以确保它是选项标签值之一
    • 不确定你的参数是什么样的,但听起来它们 :id 确实嵌套在 :category 中,这意味着当没有搜索时,将没有 :category 参数。你可以使用 try: params[:category].try(:[], :id) 来解决这个问题,这两种情况都适用。
    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2023-03-05
    • 2018-03-16
    相关资源
    最近更新 更多