ActiveAdmin仅在Show页添加action_item时出现路由错误求助
解决ActiveAdmin中Show页Action Item导致Index页路由错误的问题
问题原因分析
你已经完成了大部分正确配置,但报错的核心逻辑是:尽管给action_item加上了only: [:show],ActiveAdmin在渲染任何页面(包括Index页)时,都会遍历所有定义的action_item并检查它们的显示条件。在这个过程中,你的link_to调用里的approve_su_support_session_path是member路由,必须传入:id参数才能生成合法URL。
在Show页中,resource变量指向当前的SupportSession实例,Rails会自动提取:id参数生成路由;但在Index页中,resource代表的是资源集合(而非单个实例),调用approve_su_support_session_path时缺少必需的:id参数,因此抛出UrlGenerationError。
解决方案
修改action_item代码,明确传入resource作为路由参数,确保只有在单个资源实例存在的场景下生成链接:
action_item only: [:show] do link_to 'Approve session', approve_su_support_session_path(resource), method: :patch end
如果要更严谨,可额外添加条件判断,保证resource存在时才渲染按钮:
action_item only: [:show], if: -> { resource.present? } do link_to 'Approve session', approve_su_support_session_path(resource), method: :patch end
关于ActiveAdmin控制器与模型的连接逻辑
简单梳理下核心逻辑:
- ActiveAdmin会为每个注册的资源生成专属控制器(比如你的
SuSupportSessionsController),对应标准RESTful动作:index(处理资源集合)、show(处理单个资源实例)、edit/update等。 - 在
show动作中,ActiveAdmin会根据URL中的:id参数从数据库取出对应SupportSession实例,赋值给resource变量,供视图和action_item调用。 - 在
index动作中,resource指向资源集合(所有SupportSession记录),而非单个实例——这就是直接调用需要单个实例ID的路由会报错的原因。 action_item的only: [:show]参数仅控制按钮是否渲染,但ActiveAdmin检查条件时仍会解析action_item的block代码,这就是按钮不在Index页显示,却仍触发路由错误的根源,必须明确传入正确参数才能避免。
另外,你的member_action可以优化得更简洁:如果approval_confirmed可以改成实例方法,直接调用会更直观:
member_action :approve, method: :patch do resource.approval_confirmed redirect_to su_support_session_path(resource), notice: "Your support session has been approved!" end
如果必须使用接收support_session_id的类方法,也可以写成:
member_action :approve, method: :patch do SupportSession.approval_confirmed(resource.id) redirect_to su_support_session_path(resource), notice: "Your support session has been approved!" end
内容的提问来源于stack exchange,提问作者Chris Kenworthy
相关产品推荐
相关产品推荐

