仅显示页面上的自定义 action_item

Custom action_item on show page only

我正在努力为资源的显示页面(不是索引)创建 action_item。我需要在显示页面上添加一个按钮,当用户单击它时,它会更新资源上的单个属性(在本例中为 SupportSession 的 'status')。我在我的 SupportSession 模型上创建了一个名为 approval_confirmed 的方法,它接受一个名为 support_session_id 的参数 - 我希望调用此方法。

(顺便说一句,虽然我已经决定使用补丁,但我不确定要使用哪个 HTTP 动词(补丁、放置、获取))。

这是我的资源设置方式:

ActiveAdmin.register SupportSession, as: "SUSupportSession" do

(我给这个资源一个自定义 name/alias 因为不同的用户以不同的方式使用这个资源;所以为了简单起见,我将它们放在单独的文件中。)

这是我的 action_item 代码:

  action_item only: [:show] do
    link_to 'Approve session', approve_su_support_session_path, method: :patch
  end

这里对应的是member_action(我理解的叫action_item?):

  member_action :approve, method: :patch do
    SupportSession.with(support_session_id: resource.id).approval_confirmed
    redirect_to su_support_session_path, notice: "Your support session has been approved!"
  end

这将创建一条新路线(以下 rails 路线的输出):

approve_su_support_session PATCH      /su_support_sessions/:id/approve(.:format)                                                 su_support_sessions#approve

但是,当我尝试打开索引页面(从 table 到 select 一条记录并移动到它的显示页面时)我得到这个错误:

ActionController::UrlGenerationError in SuSupportSessions#index
No route matches {:action=>"approve", :controller=>"su_support_sessions"}, missing required keys: [:id]

我知道这与索引页上没有id参数有关(虽然我不明白为什么在索引页上调用它,因为我只需要显示页上的这个按钮- 一旦用户点击 table 中列出的任何项目 'view',id 就会出现在该位置。

感谢您的帮助。我想我对 ActiveAdmin 控制器如何连接到底层模型感到非常困惑。

正如@max 在上面的评论中所说,您必须将参数传递给您的路径,resourceresource.id 有效。

关于你现在的错误,我猜可能是因为你没有提到你想做的动作。

action_item :approve, only: [:show] do
  link_to 'Approve session', approve_su_support_session_path(resource), method: :patch
end

希望对您有所帮助。让我知道。