Rails/Active Admin如何在可选嵌套资源的index标题中获取父资源
Active Admin可选嵌套资源Index页获取父资源方案
现有配置存在一处前置错误:关联名拼写错误,belongs_to :doucment应为belongs_to :document,拼写错误会导致嵌套路由匹配逻辑直接失效。
直接给index的title传静态值时无法获取父资源的核心原因:静态值代码会在Rails启动加载Active Admin配置阶段执行,此时上下文不存在当前请求的路由、参数信息,自然无法拿到对应资源。
实现方式
将title配置改为传入延迟执行的Proc,Active Admin会在每次渲染页面、请求上下文就绪后执行该Proc,通过内置方法即可直接获取父资源:
- 调用
parent?判断当前请求是否处于嵌套路由场景 - 调用
parent直接获取已实例化的父级Document对象,无需自行解析URL或路由参数
正确配置示例:
ActiveAdmin.register Document do end ActiveAdmin.register Comment do # 修正拼写错误后的关联配置 belongs_to :document, optional: true index title: -> { if parent? # 嵌套路由场景:parent即为当前所属Document实例,可调用其任意属性 "文档《#{parent.title}》的评论列表" else # 非嵌套路由场景:返回全量评论标题 "全部评论" end } do # 原有index列表列配置 end end
自定义父资源查询逻辑
如果父资源不是默认通过主键id查询,可以在belongs_to配置中传入finder参数自定义查询规则,自定义查询返回的结果同样可以通过parent方法获取:
belongs_to :document, optional: true, finder: -> { Document.find_by!(custom_slug: params[:document_id]) }
内容的提问来源于stack exchange,提问作者CafeHey
相关产品推荐
相关产品推荐

