I've got Rails (4.0) running Devise gem (3.1.0) using model User
. I have controller named CollectionsController
and I want to get current logged in user object with Devise's accessor method current_user
in this controller.
And after that it returns undefined local variable or method 'current_user' for CollectionsController:Class
. The most interesting thing is that when I'm trying to do the same in another controller, for example PagesController
— everything works perfectly!
UPD: sharing the "code" of my controller :)
class CollectionsController < ActionController::Base
def index
@user = current_user
end
end
the source of current_user
method is defined by Devise, not me. So I don't think that is the problem.
current_user
is a convenience method made available by Devise to ApplicationController
. Your controller should be inheriting from it:
class CollectionsController < ApplicationController
It seems you may be conflating ActiveRecord::Base
(subclassed by models) with ActionController
(subclassed by controllers). According to Rails docs:
By default, only the ApplicationController in a Rails application inherits from ActionController::Base. All other controllers in turn inherit from ApplicationController.
Add before_action :authenticate_user!
to your controller.
see: https://github.com/plataformatec/devise#controller-filters-and-helpers
I was having the same problem. Some controllers could access current_user
and others could not. In one case, it was an erb
file that was accessing current_user
but only after asking user_signed_in?
I added that check in my controller code and voila! current_user
was available.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With