【问题标题】:Custom action_item on show page only仅显示页面上的自定义 action_item
【发布时间】:2019-08-19 15:35:12
【问题描述】:

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

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

这是我的资源的设置方式:

ActiveAdmin.register SupportSession, as: "SUSupportSession" do

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

这是我的 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

但是,当我尝试打开索引页面(从表中选择一条记录并移至其显示页面)时,我收到此错误:

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

我知道这与索引页面上没有 id 参数的事实有关(尽管我不明白为什么在索引页面上调用它,因为我只需要显示页面上的这个按钮 - 其中一旦用户在表格中列出的任何项目上单击“查看”,该 ID 就会出现)。

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

【问题讨论】:

  • 我对 ActiveAdmin 不是很熟悉,但你应该有某种变量或参数到可用的块中,它为你提供迭代中的当前项目(正在呈现的 SupportSession 实例) - 示例来自文档有post,所以也许approve_su_support_session_path(support_session)activeadmin.info/8-custom-actions.html
  • 我已经尝试过了('support_session' 作为变量/参数),它给出了错误'未定义的局部变量或方法'。 'su_support_session' 和 'susupport_session' 相同。
  • 你能试试action_item only: [:show] do |*args| 并检查args 看看调用块的参数是什么?
  • 似乎是一个空数组... >> args.inspect => "[]" >>
  • 会不会是像resource 这样的通用名称?

标签: ruby-on-rails ruby-on-rails-5 activeadmin


【解决方案1】:

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

关于您当前的错误,我想这可能是因为您没有提及您想要执行的操作。

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

我希望它有所帮助。告诉我。

【讨论】:

  • 成功了!非常感谢。这让我发疯......事情也很简单。所以要清楚 - 为了修复我的代码,我在action_item 之后添加了:approve,所以它知道要调用哪个方法(member_action)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2019-09-14
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多