在控制器中调用模型方法时未定义的方法
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
我的 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