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