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

时间:2018-02-13 17:28:25

标签: ruby-on-rails ruby associations

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

def self.method_name
  ...
end

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

@user = game_play.player.user

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

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

编辑:添加问题澄清代码

@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

2 个答案:

答案 0 :(得分:1)

修改

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

我认为您正在尝试应用此处找到的内容:https://stackoverflow.com/a/30857087/3372172

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

以前的答案

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

如果它是一个类方法,它不能依赖于特定对象的任何属性,也不能从该类的实例中调用它。

您必须确定它是否真的是类方法或实例方法。 ` 如果您需要从实例调用类方法,则可以执行此操作(但我不知道您为什么需要它)。

class User
  def self.method_name
    # blablabla
  end

  def method_name
    User.method_name
  end
end

答案 1 :(得分:0)

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