如何在Rails的link_to中过滤掉指定的params参数键
解决方案
错误原因说明
- 第一种尝试只提取了
params[:q]的内容进行处理,丢失了外层的嵌套结构,也丢失了params里的其他非筛选参数(比如分页参数、排序参数等),同时调用无参数的permit()会过滤掉所有字段,自然没有参数传递成功 - 第二种尝试使用了不存在的
exclude方法,Rails的ActionController::Parameters删除指定键的方法是except
优化实现方案
你可以把全局允许的筛选参数抽成公共的辅助方法,避免每个清除按钮都手动维护允许列表:
- 首先在对应页面的Helper文件(比如
admin/users_helper.rb)里定义允许的筛选参数列表,新增筛选器时仅需要在这里加对应参数键即可:
def allowed_filter_params { q: [:extra_params, :address_province_eq, :subscription_payment_type_eq, :subscription_status_eq, :created_at_gteq, :created_at_lteq], # 可以在此处添加其他非q的允许参数,比如分页、排序字段 page: [], per_page: [], sort: [] } end
- 然后在视图里的清除按钮统一使用以下写法,不需要再手动调整每个按钮的允许参数列表:
<% if params.dig(:q, "subscription_payment_type_eq").present? %> <%= link_to admin_users_path(params: params.tap do |p| # 仅删除当前要清除的筛选键,其他参数全部保留 p.dig(:q)&.delete(:subscription_payment_type_eq) end.permit(allowed_filter_params)) do %> <span class="dismiss-box glyphicon glyphicon-remove-circle"> <% end %> <% end %>
如果你的场景不需要统一维护允许列表,也可以直接嵌套调用except实现:
<%= link_to admin_users_path(params: params.permit(allowed_filter_params).tap { |p| p[:q] = p[:q]&.except(:subscription_payment_type_eq) }) do %> <span class="dismiss-box glyphicon glyphicon-remove-circle"> <% end %>
内容的提问来源于stack exchange,提问作者pinkfloyd90
相关产品推荐
相关产品推荐

