Фильтрация индексной страницы по одному полю поиска и двум раскрывающимся спискам

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

Я использую 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 раскрывающихся списка и применить их к фильтрации метода индекса. Заранее спасибо.

Вы захотите изучить select_tag, который действует как text_field_tag (непосредственно добавляя его значение к params.

AJFaraday 18.07.2019 13:44

@AJFaraday Спасибо за ваш ответ. Я смотрю на синтаксис тега select и не совсем понимаю, как его адаптировать к моему случаю. Для некоторого контекста я перечисляю объекты, и мне нужен раскрывающийся список для списка объектов по местоположению и еще один раскрывающийся список для активности. У меня уже есть 2 определения в моем помощнике приложения, называемые get_all_locations и get_all_activities , как мне заполнить указанные поля этими методами? Очень жаль, я очень новичок в рельсах.

MaybeBotox 18.07.2019 13:54

Не проблема, нужно время, чтобы научиться. Я бы использовал этот метод для создания ваших вариантов apidock.com/rails/ActionView/Helpers/FormOptionsHelper/…

AJFaraday 18.07.2019 13:58
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
3
189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Таким образом, они, вероятно, будут выглядеть так:

<%= 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-й аргументы? То, что вы назвали «имя», то есть. Я не знаю, каким должен быть мой «метод, вызываемый для генерации значения, переданного контроллеру», может быть, я упускаю что-то очень очевидное

MaybeBotox 18.07.2019 14:10

Итак, первый аргумент — это коллекция (обычно массив, но может быть и ActiveRecord::Relation). Он вызовет два метода для каждого члена коллекции: один, чтобы решить, что показывать пользователям в этом выборе, и один, чтобы решить, что передать контроллеру при его отправке. В моем примере я установил для обоих «имя». Таким образом, он вызовет location.name, чтобы решить, что показать пользователю, и передаст location.name контроллеру как params[:location]

AJFaraday 18.07.2019 14:34

Спасибо, мне удалось адаптироваться и найти способ, который работает с вашим руководством! <%= select_tag :location_filter, options_for_select(get_city_list) %> Это сработало для меня, пока в моем контроллере у меня есть: if params[:name_filter].present? || params[:activity_filter].есть? || params[:location_filter].есть? Далее следуют предложения where.

MaybeBotox 18.07.2019 15:12

Опубликовано как ответ на мой собственный пост, также новичок в публикации stackoverflow. Еще раз спасибо AJ!

MaybeBotox 18.07.2019 15:17
Ответ принят как подходящий

Вид:

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

Это сработало для того, что мне было нужно (или так кажется)

Другие вопросы по теме