首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在控制器中调用模型方法时的未定义方法

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

Stack Overflow用户
提问于 2018-02-13 17:28:25
回答 2查看 846关注 0票数 1

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

代码语言:javascript
复制
def self.method_name
  ...
end

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

代码语言:javascript
复制
@user = game_play.player.user

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

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

编辑:添加问题澄清代码

代码语言:javascript
复制
@user = @game_play.client.user.
@token = @user.set_login_bypass_token

我的模特:

代码语言:javascript
复制
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

错误:

代码语言:javascript
复制
PG::UndefinedColumn: ERROR:  column users.login_bypass_token does not exist

注意,错误将它作为users.login_bypass_token而不是set_login_bypass_token

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-13 17:56:31

编辑:

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

我想你是在尝试应用你在这里发现的东西:https://stackoverflow.com/a/30857087/3372172

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

先前的答案

如果方法需要访问实例变量(这意味着它根据用户类中的特定对象采取不同的操作),那么它应该是一个实例方法,它定义时不使用self关键字。

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

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

代码语言:javascript
复制
class User
  def self.method_name
    # blablabla
  end

  def method_name
    User.method_name
  end
end
票数 1
EN

Stack Overflow用户

发布于 2018-02-13 17:42:18

应该使用实例方法而不是类方法。我不知道它在模型上寻找属性时如何得到一个错误,因为这些属性只能在模式中定义。如果您要在模型中添加一个常规实例方法,那么它应该能够正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48772424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档