在控制器中调用模型方法时未定义的方法

Undefined method when calling model method in controller

我的 User 模型中有一个 class 方法:

def self.method_name
  ...
end

在控制器中,我需要在通过关联获得的 User 实例上调用此方法:

@user = game_play.player.user

正如预期的那样,它抛出了一个无方法错误,因为它是一个 class 方法。

这种情况下方法的调用方式是什么?

编辑:添加问题澄清代码

@user = @game_play.client.user.
@token = @user.set_login_bypass_token

我的模特:

def set_login_bypass_token
  #We generate a raw token and an encrypted version of the same token
  raw, enc = Devise.token_generator.generate(User, :login_bypass_token)
  self.login_bypass_token = enc
  self.login_bypass_token_set_at = Time.now
  self.save(validate: false)
  #Raw token is sent to the user via email to provide auto-login
  raw
end

错误:

PG::UndefinedColumn: ERROR:  column users.login_bypass_token does not exist

注意错误是 users.login_bypass_token 而不是 set_login_bypass_token

应该使用实例方法而不是 class 方法。我不确定在模型上查找属性时如何出错,因为这些属性只能在模式中定义。如果您在模型中添加常规实例方法,它应该可以正常工作。

编辑:

我的第一个回答是在您提到 Devise 之前并假设您不知道是否需要 class 或实例方法。很明显,你的方法必须是一个实例。

我认为您正在尝试应用您在此处找到的内容:

这需要您向用户数据库添加一个新字段,以管理 :login_bypass_token。因为你稍后会用到这个列来执行一个find_by。 Devise 不会将此列添加到数据库中。

上一个答案

如果该方法需要访问实例变量(这意味着它根据 User class 中的特定对象表现不同),它应该是一个实例方法,定义时没有 self关键字。

如果它是 class 方法,它不能依赖于特定对象的任何属性,也不能从 class.

的实例调用它

您必须确定它是真正的 class 方法还是实例方法。 ` 如果您需要从实例调用 class 方法,您可以这样做(但我不知道您为什么需要它)。

class User
  def self.method_name
    # blablabla
  end

  def method_name
    User.method_name
  end
end