【问题标题】:Calling on methods from another model file从另一个模型文件调用方法
【发布时间】:2015-08-07 10:22:20
【问题描述】:

在我的邀请模型中,我有:

attr_accessor :user_token

def create_user(user)
  create_user_digest
  ...
end

private
  def create_user_digest
    self.user_token  = User.new_token
    self.user_digest = User.digest(user_token)
  end

它会产生错误:

undefined method `user_digest=' for #<Invitation:0x000000044c3318>

我已经从 User 模型中调整了设置,在该模型中我有一个类似的注册身份验证设置。 user_digestInvitation 表中的一列。 .new_token.digestUser 模型中的方法(见下文)。什么可能导致错误?

def User.digest(string)
  cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                BCrypt::Engine.cost
  BCrypt::Password.create(string, cost: cost)
end

def User.new_token
  SecureRandom.urlsafe_base64
end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 model


    【解决方案1】:

    这是因为你在邀请模型的 user_digest 属性上没有任何设置器,你应该添加

    attr_accessor :user_digest
    

    这种方式与 :user_token 的工作方式相同(Ruby 将为您创建一个 getter 和一个 setter)。

    希望对你有帮助

    【讨论】:

    • 谢谢,但我不明白的是,在User 模型的身份验证设置中,我不需要摘要的设置器,只需要令牌。这对我来说很有意义,因为摘要是保存到数据库中列中的变量,而令牌不是(就像您在将其他变量保存到数据库时不包括表单中的其他变量一样)。那么为什么在这种情况下会有所不同呢?如果我使用 setter,它还会将摘要保存到数据库吗?
    • 你能给我们Invitation模型的架构(还有User),我很确定没有名为user_digest的列(可能是错字?)
    • 啊,我要咖啡,原因是添加列后忘记迁移了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多