如何从 link_to 中传递的参数中过滤特定的参数键?

How can I filter a specific params key from params passed in a link_to?

我有一个索引,用户可以在其中通过复选框应用许多不同类型的过滤器。

每个过滤器都有一个“X”link_to 按钮,用于关闭过滤器,它基本上向当前 params 的相同索引页面 permit 发出请求,但以下内容除外已关闭的过滤器的参数键。

例如:

<div class="form-group <%= 'hidden' unless params.dig(:q, "subscription_payment_type_eq").present? %>" id="subscription_payment_type_eq" data-toggle-target="objective">
  <%= f.select :subscription_payment_type_eq, payment_types_selector_for_filter,  { include_blank: "Forma de pago..."}, class: "form-control gray my-2 " %>
  <% if params.dig(:q, "subscription_payment_type_eq").present? %>
    <%= link_to admin_users_path(params: params.permit(q: [:extra_params, :address_province_eq, :subscription_status_eq, :created_at_gteq, :created_at_lteq])) do %>
      <span class="dismiss-box glyphicon glyphicon-remove-circle">
    <% end %>
  <% end %>
</div>
<div class="form-group <%= 'hidden' unless params.dig(:q, "address_province_eq").present? %>" id="address_province_eq" data-toggle-target="objective">
  <%= f.select :address_province_eq, user_provinces_selector_for_filter, { include_blank: "Provincia..."}, class: "form-control gray my-2 " %>
  <% if params.dig(:q, "address_province_eq").present? %>
    <%= link_to admin_users_path(params: params.permit(q: [:extra_params, :subscription_payment_type_eq, :subscription_status_eq, :created_at_gteq, :created_at_lteq])) do %>
      <span class="dismiss-box glyphicon glyphicon-remove-circle">
    <% end %>
  <% end %>
</div>

该方法可行,但手动将例外参数键添加到添加到索引页面的每个新过滤器非常麻烦。

有没有办法传递参数,但不包括属于被驳回的过滤器的参数键?

我尝试了以下但没有传递任何参数:

  <% if params.dig(:q, "subscription_payment_type_eq").present? %>
    <%= link_to admin_users_path(params: params[:q].except(:subscription_payment_type_eq).permit) do %>
      <span class="dismiss-box glyphicon glyphicon-remove-circle">
    <% end %>
  <% end %>

也试过这个但是got undefined method 'exclude' for #<ActionController::Parameters:0x00007f6331b00dd8>

<%= link_to admin_users_path(params: params.exclude(:subscription_payment_type_eq).permit) do %>

Permit 需要一个参数列表,并且由于您没有发送任何参数,因此不会将任何参数传递给您的控制器。我实际上不确定没有 args 的调用许可是如何工作的。不管怎样,也许你可以这样试试:

 <%= link_to admin_users_path(params: params[:q].except(:subscription_payment_type_eq.permit!)

最后我们决定这样实现:

<%= link_to admin_users_path(
            params: { q: params.require(:q).permit(params[:q].keys - ["address_province_eq"]) }
          ) do %>

link_to

中传递时,我们基本上从当前参数中减去过滤器的键