在我的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
发布于 2018-02-13 17:56:31
编辑:
我的第一个回答是在您提到Devise之前,假设您不知道是否需要一个类或实例方法。很明显,您的方法必须是实例方法。
我想你是在尝试应用你在这里发现的东西:https://stackoverflow.com/a/30857087/3372172
这需要向用户数据库中添加一个新字段,以管理:login_bypass_token。因为稍后您将使用本列来执行find_by。Devise不将此列添加到数据库。
先前的答案
如果方法需要访问实例变量(这意味着它根据用户类中的特定对象采取不同的操作),那么它应该是一个实例方法,它定义时不使用self关键字。
如果它是一个类方法,它不能依赖于来自特定对象的任何属性,也不能从类的实例中调用它。
您必须决定它是真正的类方法还是实例方法。‘如果您需要从实例中调用一个类方法,您可以这样做(,但我不知道为什么需要它)。
class User
def self.method_name
# blablabla
end
def method_name
User.method_name
end
end发布于 2018-02-13 17:42:18
应该使用实例方法而不是类方法。我不知道它在模型上寻找属性时如何得到一个错误,因为这些属性只能在模式中定义。如果您要在模型中添加一个常规实例方法,那么它应该能够正常工作。
https://stackoverflow.com/questions/48772424
复制相似问题