【问题标题】:remove empty params from url从 url 中删除空参数
【发布时间】: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


    【解决方案1】:

    您的问题是您从 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 %>
    

    通过将所有共性放入base 中,这还可以清除您的users_path 调用中的重复。

    您也可以使用params.permit(:c, :ex, ...) 而不是params.to_unsafe_h,但无论如何您都在过滤它们,这并不重要。

    另外,您确定已将:user_search:job 参数添加到正确的链接中吗?似乎您的第一个条件将包括 job: params[:job] 而不是 user_search: params[:user_search]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2016-10-09
      相关资源
      最近更新 更多