Active Admin 筛选结果页编辑记录,保存后如何返回带原筛选的页面
Active Admin 编辑筛选后列表记录的回跳保留实现
核心逻辑为缓存索引页的筛选、分页、作用域参数,覆盖Active Admin默认更新后跳转无参数索引页的行为,实现回跳时完整保留之前的筛选结果。
全局通用配置(一次配置全资源生效)
- 修改Active Admin基础控制器,新增参数缓存与跳转覆盖逻辑:
# 路径:app/controllers/active_admin/base_controller.rb module ActiveAdmin class BaseController before_action :cache_index_filters, only: [:index] after_action :redirect_with_cached_filters, only: [:update] private def cache_index_filters # 仅存储带实际筛选、分页、作用域的非空请求参数 has_valid_params = params[:q].present? || params[:page].present? || params[:scope].present? if has_valid_params session["admin_#{resource_class.model_name.singular}_filters"] = params.permit!.to_h end end def redirect_with_cached_filters # 取出缓存参数并清除,避免后续请求残留旧筛选 cached_filters = session.delete("admin_#{resource_class.model_name.singular}_filters") return unless cached_filters.present? redirect_to polymorphic_path([:admin, resource_class], cached_filters), notice: I18n.t("active_admin.update_model", model: resource_class.model_name.human) end end end
单资源定向配置
- 无需修改全局控制器,只在指定资源的配置块中实现相同逻辑即可,以文章资源为例:
# 路径:app/admin/post.rb ActiveAdmin.register Post do controller do before_action :cache_post_index_filters, only: [:index] after_action :redirect_post_after_update, only: [:update] private def cache_post_index_filters if params[:q].present? || params[:page].present? session[:post_index_filters] = params.permit!.to_h end end def redirect_post_after_update filters = session.delete(:post_index_filters) return unless filters.present? redirect_to admin_posts_path(filters), notice: "记录更新成功" end end end
实现注意事项
- 参数统一通过session存储,避免复杂筛选参数直接拼入URL导致长度超限问题
- 缓存逻辑默认包含页码参数,回跳时可直接定位到编辑前所在的分页位置,无需手动翻页
- 跳转后立即清除缓存的筛选参数,避免用户后续访问无筛选索引页时错误加载历史筛选条件
内容的提问来源于stack exchange,提问作者Fu nam Kwan
相关产品推荐
相关产品推荐

