使用Devise的current_user编写自定义方法?

时间:2014-03-04 09:30:37

标签: ruby-on-rails ruby-on-rails-4 devise

我正在使用Rails 4.0.2和Devise 3.2.2来处理用户注册/身份验证。

我想为Devise的current_user编写自定义方法,此方法用于检查current_user登录的次数。我将使用sign_in_count

我是在User模型中编写方法还是应该在Users Controller中定义方法?

是否可以写下面的内容

def count
  user = current_user
  user.sign_in_count
end

并致电current_user.count

谢谢

---- ----编辑

如果我需要添加其他方法,我可以添加类似下面的内容

#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

1 个答案:

答案 0 :(得分:1)

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

取决于您希望使用方法

的位置(& when)

如果你打算将它作为“控制器级”交互性的一部分使用,你需要将它放入UsersController,但是如果它将用于“模型级别” (通过多个控制器/模型),您可能希望将其放入模型中

您需要注意的是current_user是帮手,并且在模型级别不可用:

#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

但正如@apneadiving所述,更有效的方法是直接引用current_user.sign_in_count属性


<强>更新

在参考您的更新时,您最好阅读class & instance methods

您可以执行以下方法:

#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

在我对模型/控制器方法的引用中 - 如果要在应用程序级别(例如User.weight_gain?)提供标准功能,则可以使用模型方法。如果您使用的是以控制器为中心的数据,则最好将其全部保存在控制器中