【发布时间】:2018-12-08 02:07:48
【问题描述】:
我的 Rails 应用程序中有一个“高级搜索”功能,用户可以在其中过滤结果。该页面位于https://myurl/users/search。搜索表单过滤器工作正常,它重定向到https://myurl/users,这是显示过滤结果的索引页面。
我唯一担心的是,当用户没有为像 https://myurl/users?cert=CCNA&ed=&ex=&job=NetworkEng&lang=&maj=&s=&u= 这样的参数选择任何值时,url 会填充所有空参数。
我希望看到的只是有价值的参数。例如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)}
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5