【问题标题】:how to mixin gem-modules in ruby-on-rails model如何在 ruby​​-on-rails 模型中混合 gem-modules
【发布时间】:2016-11-08 04:40:58
【问题描述】:

我正在构建一个 gem,其中有一个模块 OtpGenerator。在这个模块中,我有 generate_otpverify_otp 等方法。这对我来说只是一个开始,它非常简单的 gem 只用于生成和验证以及保存和发送,仅此而已。现在任何使用这个 gem 的人都必须在他们的模型中包含这个模块。例如有一个user 模型。现在我想要的是首先我将创建一个实例

user = User.new(params[:user])

现在我需要操作user.generate_otp,这将在activerecord实例中分配与otp相关的东西。

之后user.save,也可以。

但我还想要一个函数generate_otp!,它将完成所有任务,例如生成 otp,而不是保存并发送它。我的问题是我没有得到如何实现这个功能。

注意:我对 ruby​​ 很陌生。并且真的对 mixins 感到困惑。

这是我的 otp.rb 文件代码

require 'securerandom'

module OtpGenerator
  def generate_otp
    #do something here
  end

  def verify_otp(otp)
    #do something here
  end

  def regenerate_otp
    #do something here
  end

  def matches?(generated, otp)
    #do something here
  end

  def expired?(otp_expiry_time)
    #do something here
  end
end

此代码仍在开发中,我只想知道如何实现generate_otp! 函数,它将完成所有三个操作,即 (1) 生成otp(user.generate_otp) (2) 保存otp(user.save) (3) 发送 otp(我已经创建了发送函数,所以这不是问题。)

【问题讨论】:

  • 正如您提到的 generate_otp!应该和你描述的一样简单!按要执行的顺序添加三个方法。我实际上可以看到的一个问题是,即使生成的 OTP 似乎也没有存储在任何地方,这有点问题,因为我确信验证需要对此的引用
  • generate_otp! 方法位于我的 gem 模块中,该模块将包含在模型中。现在当user.generate_otp! 被调用时,我不确定我将如何在我的模块中实现user.save

标签: ruby-on-rails ruby rubygems mixins one-time-password


【解决方案1】:

如果这是您模型中的 mixin,那么您的模型也应该可以访问它。这就是我的意思:

class User
  include OtpGenerator
end

module OtpGenerator
...
  def generate_otp!
    generate_otp
    save
    send_generated_otp
  end
end

当您致电User.find(45).generate_otp!

由于继承在 Ruby 中的工作方式,这会起作用。一旦模块被包含在一个类中,它就会继承该模块的所有方法,并且该模块可以访问被包含类的上下文。

希望能回答你的问题

【讨论】:

  • 感谢@oreoluwa 的回复,但是由于我是 ruby​​ 新手,所以我仍在学习 mixins,所以正如您所指定的,这是否意味着当我调用 user.generate_otp! 时,它会调用所有三个方法是顺序,即user.generate_otpuser.save,而不是我的发送功能。另请注意,保存功能不是我实现的,它是在数据库中保存详细信息的内置功能。
  • 因为我已经指定应用程序开发人员将创建一个新的实例变量user,它获取所有参数,即user = User.new(params[:user])。现在user.save 将在数据库中保存详细信息。好吧,你看起来是个有经验的人,你比我更了解。
  • 是的,save 是 ActiveRecord。但是因为您将 gem 包含在 ActiveRecord 实例的范围内,所以您可以调用 save 方法。我会说你应该尝试一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2015-02-04
  • 1970-01-01
  • 2020-06-03
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多