2014-01-10 4 views
1

У меня есть индексная страница, отображающая все поездки в базе данных. В верхней части страницы находится фильтр с раскрывающимися списками, в котором вы можете выбрать категорию, регион или оба, чтобы отфильтровать результаты.Сброс выпадающего списка до выбранного значения

Когда вы выберете свой выбор и нажмите «показать», выпадающие списки вернутся к умолчанию по умолчанию «Все категории» и «Все регионы».

Как я могу получить выбранную опцию для отображения в раскрывающемся списке при фильтрации результатов?

Вот мой выпадающее меню:

.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' 

EDIT ::

Я попытался добавить значение selected и получил 'неопределенный метод `[]' для ноль: ошибка NilClass'. Я думал, что это связано с тем, что первое значение моего раскрывающегося списка было «Все категории», а не фактически являлось объектом в db, что лишено идентификатора. Вот обновленный код и сервер вывод:

.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' 

ответ

2

Используйте :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

Что происходит on: путем передачи значения в :selected optio n вспомогательного элемента формы collection_select, вы говорите ему, чтобы отметить один из тегов параметров, выбранных при совпадении значений. Так, например, учитывая параметры «яблоко», «банан», «шоколад»:

<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> 

Надеюсь, что это поможет.

Edit: Вы вызываете значение Params неправильно, вместо:

params[:category][:id] 

должно быть:

params[:category_id] 

и идет на другие пары, а также.

Это потому, что хелпер формы: collection_select :category, :id сгенерирует тэг select с именем category_id, и этот параметр будет представлен.

Ошибка no method [] for nilClass была вызвана params[:category], возвращающая нуль, потому что такого параметра нет.

+0

Отличное объяснение. Единственная проблема заключается в том, что первое приглашение «Все категории» или «Все регионы» не является категорией или регионом в базе данных, поэтому у него нет идентификатора.Поэтому, когда я пытаюсь загрузить страницу, я получаю «неопределенный метод» [] 'для nil: NilClass. Но если выбор уже сделан, он загружается отлично и работает, как вы объяснили. Спасибо. – reknirt

+0

Это не то, что вызывает эту ошибку. : prompt и: select хорошо работают вместе, даже один из параметров приглашения не имеет значения. Если вы хотите, вы можете опубликовать код вида, вызывающий это, а также ошибку и первые несколько строк обратной линии – DiegoSalazar

+0

Я отредактировал свое оригинальное сообщение. Огромное спасибо. – reknirt

Смежные вопросы