Chris Kenworthy
Chris Kenworthy

Reputation: 129

Custom action_item on show page only

I'm struggling to create an action_item for a show page (not the index) of a resource. I need to add a button on the show page, which when the user clicks it, updates a single attribute on the resource (in this case 'status' of a SupportSession). I have created a method on my SupportSession model called approval_confirmed which accepts a parameter called support_session_id - I'd like this method to be called.

(BTW I'm not sure which HTTP verb to use (patch, put, get) though I've settled on patch).

Here's how my resource is set-up:

ActiveAdmin.register SupportSession, as: "SUSupportSession" do

(I've given this resource a custom name/alias because different users use this resource in different ways; so for simplicity I keep them in separate files.)

Here is my action_item code:

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

Here is the corresponding member_action (which I understand is called by the 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

This creates a new route (output of rails routes below):

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

However, when I try to open the index page (to select a record from the table and move to its show page) I get this error:

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

I understand this is something to do with the fact that there is no id parameter on the index page (although I don't understand why it's getting called on the index page because I only need this button on the show page - where the id will appear once a user clicks 'view' on any item listed in a table).

Thanks for your help. I think I'm getting terribly mixed up with how ActiveAdmin controllers connect to the underlying model.

Upvotes: 2

Views: 1313

Answers (1)

morissetcl
morissetcl

Reputation: 564

As @max says in comment above your have to pass an argument to your path, resource or resource.id works.

Regarding your current error I guess it could be caused because you have not mentionned the action you want to do.

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

I hope it helps. Let me know.

Upvotes: 3

Related Questions