удалить пустые параметры из URL - PullRequest
0 голосов
/ 29 июня 2018

В моем приложении rails есть функция «расширенного поиска», где пользователи могут фильтровать результаты. страница находится по адресу https://myurl/users/search. Фильтр формы поиска работает нормально и перенаправляет на https://myurl/users, который является страницей указателя, показывающей отфильтрованные результаты.

Меня беспокоит только то, что URL заполняется всеми пустыми параметрами, когда пользователь не выбрал значения для таких параметров, как этот https://myurl/users?cert=CCNA&ed=&ex=&job=NetworkEng&lang=&maj=&s=&u=

я хотел бы видеть только те параметры, которые имеют значение. Например https://myurl/users?cert=CCNA&job=NetworkEng

вот пример того, что я имею в виду. Это создаст кнопку с поисковым термином в нем, который выбрал пользователь, и при нажатии на кнопку этот конкретный поисковый фильтр будет удален.

Я бы хотел, чтобы только параметры, которые пользователь фактически заполнил, отображались в URL, если это возможно, и скрывали все остальные. Я думаю, что, возможно, мне нужно как-то использовать hidden_field_tag или, возможно, проверить, что каждое значение присутствует, прежде чем показывать в link_to?

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

<% if params[:job].present? %>
  <%= link_to  users_path( c: params[:c], ex: params[:ex], s: params[:s], sk: params[:sk], lang: params[:lang], 
                           cert: params[:cert], u: params[:u], relo: params[:relo], ed: params[:ed], maj: params[:maj], user_search: params[:user_search] ) , class: "btn btn-outline-danger" do %>
    <i class="fa fa-times"></i> <%= "#{params[:job]}"  %>
  <% end %>        
<% end %>      

<% if params[:user_search].present? %>
  <%= link_to  users_path( c: params[:c], ex: params[:ex], s: params[:s], sk: params[:sk], lang: params[:lang], 
                           cert: params[:cert], u: params[:u], relo: params[:relo], ed: params[:ed], maj: params[:maj], job: params[:job] ) , class: "btn btn-outline-danger" do %>
    <i class="fa fa-times"></i> <%= "#{params[:user_search]}"  %>
  <% end %>        
<% end %>   

пример того, что есть в моем users_controller

  if params[:user_search].present? 
    @users = @users.by_keyword(params[:user_search])
  end 

пример областей применения в моей пользовательской модели

  scope :by_will_relocate, ->(relo) { where(will_relocate: true).order(updated_at: :desc) if relo.present? }
  scope :by_current_job_title, ->(job) { where('current_job_title LIKE ?', "%#{job}%").order(updated_at: :desc) if job.present? }

   scope :by_keyword, ->(k) { by_skill(k) | by_language(k) | by_certification_or_cert_authority(k) | by_education_level(k) | by_university_major(k)}

1 Ответ

0 голосов
/ 29 июня 2018

Ваша проблема в том, что вы извлекаете ключи из params без учета их значений или независимо от того, указаны они или нет:

c: params[:c], ex: params[:ex], s: params[:s], sk: params[:sk], lang: params[:lang], cert: params[:cert], u: params[:u], relo: params[:relo], ed: params[:ed], maj: params[:maj]

Если вы хотите игнорировать вещи, которые не указаны, используйте slice:

params.to_unsafe_h.slice(:c, :ex, :s, :sk, :lang, :cert, :u, :relo, :ed, :maj)
params.to_unsafe_h.slice(*%i[c ex s sk lang cert u relo ed maj])

Чтобы быть в безопасности, вы также можете удалить значения, которые есть, но явно nil:

base = params.to_unsafe_h
             .slice(*%i[c ex s sk lang cert u relo ed maj])
             .select { |_, v| !v.nil? }

Затем, когда вы создаете свои ссылки, добавьте дополнительные:

<% if params[:job].present? %>
  <%= link_to users_path(base.merge(user_search: params[:user_search])), class: "btn btn-outline-danger" do %>
    <i class="fa fa-times"></i> <%= "#{params[:job]}"  %>
  <% end %>        
<% end %>

Это также устраняет дублирование в ваших users_path вызовах, помещая всю эту общность в base.

Вы также можете использовать params.permit(:c, :ex, ...) вместо params.to_unsafe_h, но вы все равно их фильтруете, это не имеет большого значения.

Кроме того, вы уверены, что к правильным ссылкам добавлены параметры :user_search и :job? Кажется, что ваше первое условие будет включать job: params[:job], а не user_search: params[:user_search].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...