Question

I am using Rails 4.0.2 and Devise 3.2.2 to handle user registration / authentication.

I would like to write a custom method for Devise's current_user , this method is for checking how many times does the current_user sign in. I will be using sign_in_count

Do I write the method in the User model or should I define the method in Users Controller ?

Is it possilbe to write something like the below

def count
  user = current_user
  user.sign_in_count
end

and call current_user.count ?

Thanks

----edited----

What if I need to add other methods, am I able to add something like the below

#app/controllers/post_controller.rb

before_action :check_time

def check_time
    time = User.last_sign_in_at(current_user) 
    if # something
        # do bla bla
    end
end
Was it helpful?

Solution

Do I write the method in the User model or should I define the method in Users Controller ?

It depends where (& when) you want to use the method

If you're going to use it as part of the "controller-level" interactivity, you'll want to put it into the UsersController, but if it's going to be used on "model-level" (by multiple controllers / models), you may wish to put it into the model

Something you need to be aware of is that current_user is a helper, and is not available at model level:

#app/controllers/products_controller.rb
def lookup
    sign_ins = User.sign_in_count(current_user)
    if sign_ins > 10 
        #do something
    end
end

#app/models/user.rb
Class User < ActiveRecord::Base
    def self.sign_in_count(user)
        user = find(user.id)
        user.sign_in_count
    end
end

But as stated by @apneadiving, a far more efficient way to do this is to reference the current_user.sign_in_count attribute directly


Update

In reference to your update, you'll be best reading up about class & instance methods

You could perform the method like this:

#app/controllers/post_controller.rb

before_action :check_time

private 
def check_time
    time = current_user.last_sign_in_at
    if # something
        # do bla bla
    end
end

In my references to model / controller methods - you'd use model methods if you wanted to give standard functionality on an app-wide level (such as User.weight_gain?). If you're using controller-centric data, you're best to keep it all in the controller

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top