【问题标题】:Writing custom method using Devise's current_user?使用 Devise 的 current_user 编写自定义方法?
【发布时间】:2014-03-04 09:30:36
【问题描述】:

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

我想为Devise的current_user写一个自定义方法,这个方法是用来检查current_user登录了多少次。我将使用sign_in_count

我应该在用户模型中编写方法还是应该在用户控制器中定义方法?

可以写成下面这样吗

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

【问题讨论】:

  • 你为什么不用current_user.sign_in_count
  • @apneadiving 哦,是的,其他方法怎么样?请查看编辑后的帖子

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


【解决方案1】:
Do I write the method in the User model or should I define the method in Users Controller ?

这取决于您想在何处(以及何时)使用该方法

如果您打算将它用作“控制器级别”交互的一部分,您需要将其放入 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?),您将使用模型方法。如果您使用以控制器为中心的数据,最好将其全部保存在控制器中

【讨论】:

  • 感谢您的评论,其他方法怎么样?请查看编辑后的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多