Я пытаюсь отфильтровать результаты страницы индекса, учитывая содержимое окна поиска и все, что выбрано в двух других раскрывающихся списках.
Я использую simple_form, и я уже заставил поиск BOX работать и фильтровать результаты с помощью одного из параметров:
Мой вид:
<%= form_tag(entitys_path, method: :get) do %>
<%= text_field_tag :name_filter, params[:name_filter] %>
<%= submit_tag 'Search' , name: nil %>
<% end %>
Мой индексный метод:
def index
@entitys = if params[:name_filter]
Entity.joins(:user).where('LOWER(users.name) LIKE?', "%#
{params[:name_filter]}%".downcase).paginate(page:
params[:page], per_page: 8)
else
@entitys = Entity.all.paginate(page: params[:page],
per_page: 8)
end
end
Я не могу понять, как сделать еще 2 раскрывающихся списка и применить их к фильтрации метода индекса. Заранее спасибо.
@AJFaraday Спасибо за ваш ответ. Я смотрю на синтаксис тега select и не совсем понимаю, как его адаптировать к моему случаю. Для некоторого контекста я перечисляю объекты, и мне нужен раскрывающийся список для списка объектов по местоположению и еще один раскрывающийся список для активности. У меня уже есть 2 определения в моем помощнике приложения, называемые get_all_locations и get_all_activities , как мне заполнить указанные поля этими методами? Очень жаль, я очень новичок в рельсах.
Не проблема, нужно время, чтобы научиться. Я бы использовал этот метод для создания ваших вариантов apidock.com/rails/ActionView/Helpers/FormOptionsHelper/…
Из комментария похоже, что вопрос заключается в том, как заполнить выбранные теги. Вот нужные методы
Таким образом, они, вероятно, будут выглядеть так:
<%= select_tag(
'location',
options_from_collection_for_select(
get_all_locations,
'name', # The method called to generate the value passed up to the controller
'name' # The value displayed to users
)
) %>
Это будет заполнено params[:location]
при отправке формы.
Еще раз спасибо, я действительно пытался понять, как это решить, но какими именно будут 3-й и 4-й аргументы? То, что вы назвали «имя», то есть. Я не знаю, каким должен быть мой «метод, вызываемый для генерации значения, переданного контроллеру», может быть, я упускаю что-то очень очевидное
Итак, первый аргумент — это коллекция (обычно массив, но может быть и ActiveRecord::Relation). Он вызовет два метода для каждого члена коллекции: один, чтобы решить, что показывать пользователям в этом выборе, и один, чтобы решить, что передать контроллеру при его отправке. В моем примере я установил для обоих «имя». Таким образом, он вызовет location.name
, чтобы решить, что показать пользователю, и передаст location.name
контроллеру как params[:location]
Спасибо, мне удалось адаптироваться и найти способ, который работает с вашим руководством! <%= select_tag :location_filter, options_for_select(get_city_list) %> Это сработало для меня, пока в моем контроллере у меня есть: if params[:name_filter].present? || params[:activity_filter].есть? || params[:location_filter].есть? Далее следуют предложения where.
Опубликовано как ответ на мой собственный пост, также новичок в публикации stackoverflow. Еще раз спасибо AJ!
Вид:
<%= form_tag(entitys_path, method: :get) do %>
<%= text_field_tag :name_filter, params[:name_filter] %>
<%= select_tag :location_filter, options_for_select(get_city_list) %>
<%= select_tag :activity_filter, options_for_select(get_professional_activity_list) %>
<%= submit_tag 'Procurar' , name: nil %>
<% end %>
Метод индекса контроллера:
def index
if params[:name_filter].present? || params[:activity_filter].present? || params[:location_filter].present?
@entitys = Entity.joins(:user).where('LOWER(users.name) LIKE?', "%#{params[:name_filter]}%".downcase).where('LOWER(entities.location) LIKE?', "%#{params[:location_filter]}%".downcase).where('LOWER(entities.professional_activity) LIKE?', "%#{params[:activity_filter]}%".downcase).paginate(page: params[:page], per_page: 8)
else
@entitys = Entity.all.paginate(page: params[:page], per_page: 8)
end
end
enter code here
Это сработало для того, что мне было нужно (или так кажется)
Вы захотите изучить
select_tag
, который действует какtext_field_tag
(непосредственно добавляя его значение кparams
.