【发布时间】: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