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

Était-ce utile?

La 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.

Autres conseils

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top