Question

I have cleaned up my deep routes and replaced them with shallow routes thanks to great input. I'm trying to get a custom method working and missing connecting the dots on something. My routes.rb has these lines:

resources :members, shallow: true do
  resources :events, shallow: true do
    get 'complete' => 'events#complete'
    resources :items
  end
end

My goal is to be able to call 'events/:id/complete' on an event an event to complete it and do post processing for it. The above route adds this following route:

event_event_complete GET    /events/:event_id/complete(.:format)     events#complete
       member_events GET    /members/:member_id/events(.:format)     events#index
                     POST   /members/:member_id/events(.:format)     events#create
    new_member_event GET    /members/:member_id/events/new(.:format) events#new
          edit_event GET    /events/:id/edit(.:format)               events#edit
               event GET    /events/:id(.:format)                    events#show
                     PATCH  /events/:id(.:format)                    events#update
                     PUT    /events/:id(.:format)                    events#update
                     DELETE /events/:id(.:format)                    events#destroy

Currently controller action:

def complete
  @event = Event.find(params[:event_id])
end

How I thought it should be:

def complete
  @event = Event.find(params[:id])
end

Seems like I'm putting it in the wrong place or missing something since it passes the event as :event_id instead of :id. Everything works but it seems like this is messier then it should be so I'm betting I'm doing something silly wrong.

Thanks in advance for any help!

Mark

Was it helpful?

Solution

Update your routes as below:

  resources :members, shallow: true do
    resources :events, shallow: true do
      member do
        get 'complete' => 'events#complete'
      end
      resources :items
    end
  end

This way you would receive event id in params[:id] instead of params[:event_id] for complete actions route.

OTHER TIPS

do this with @event = Event.find(params[:id])

resources :members, shallow: true do
    resources :events, shallow: true do
      member do
        get 'complete' => 'events#complete'
      end
      resources :items
    end
  end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top