如何在轨道上的红宝石模型中混合宝石模块



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

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

现在我需要user.generate_otp进行操作,这将在活动记录实例中分配与OTP相关的东西。

之后user.save,这也很好。

但是我也想要一个函数generate_otp!,它将执行生成 otp 等所有任务,而不是保存并发送它。我的问题是我不知道如何实现此功能。

注意:我对红宝石很陌生。 并且真的与混音混淆了。

这是我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(我已经创建了发送功能,所以这不是问题。

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

class User
  include OtpGenerator
end
module OtpGenerator
...
  def generate_otp!
    generate_otp
    save
    send_generated_otp
  end
end

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

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

希望能回答您的问题

最新更新