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

Posted

技术标签:

【中文标题】如何从 link_to 中传递的参数中过滤特定的参数键?【英文标题】:How can I filter a specific params key from params passed in a link_to? 【发布时间】:2021-09-25 12:47:39 【问题描述】:

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

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

例如:

<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 #&lt;ActionController::Parameters:0x00007f6331b00dd8&gt;

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

【问题讨论】:

【参考方案1】:

最后我们决定这样实现:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何从 link_to 中传递的参数中过滤特定的参数键?的主要内容,如果未能解决你的问题,请参考以下文章

在 Jquery 中访问传递给 link_to 的多个数据参数

如何将参数从视图传递到自定义控制器

将参数从视图传递到控制器

如何从 URL 中过滤特定参数?

您如何通过传递参数从fllite中显示来自sqlite的特定数据

如何通过link_to传递一个post请求