I’m trying to add a custom action (‘last_five’) to a controller.
My routes are specified as:
people_last_five GET /people/last_five(.:format) {:action=>"last_five", :controller=>"people"}
(i.e. that’s the output of rake_routes).
But when I browse to /people/last_five I get the following error.
Started GET “/people/last_five” for XXX.XX.XXX.XXX at Sun May 15 22:03:18 +0000 2011
Processing by PeopleController#last_five as HTML
User Load (1.4ms)^[[0m SELECTusers.* FROMusersWHEREusers.id= 3 LIMIT 1
Completed in 86ms
ActiveRecord::RecordNotFound (Couldn’t find Person without an ID):
I thought this was a problem in my routes.rb
In my routes.rb I currently have:
get 'people/last_five'
resources :people
I’ve also tried
resources :people do
get 'last_five', :on => collection
end
but that gives the same results.
Why is rails trying to get an ID when there is no “/:id/” in the route?
This even happens when I specify the route as ‘/people/:id/last_five’ and pass it a dummy id. In that case it still tells me ActiveRecord::RecordNotFound (Couldn’t find Person without an ID).
I have this problem even when I reduce the action itself to a stub for debugging, so I don’t think that’s the problem. In my controller:
# GET /people/last_five
def last_five
logger.info "LAST FIVE IS BEING CALLED"
#@people = Person.last_five
#respond_with @people do |format|
# format.json { render :json => @people }
#end
end
Any idea what’s going on here? It seems like rails is being told to get an ID by something outside of routes.rb. I’ve looked everywhere I can think.
Any leads are HIGHLY appreciated.
Thanks.
EDIT:
My PeopleController begins like so:
before_filter :authenticate_user!, :except => []
filter_resource_access
respond_to :html, :js, :json
Per the discussion on your questions, the cause is a before/around filter interfering rather than an issue with your specific action. Your application is searching for a
User, so it may be authentication-related.