我正在构建一个 gem,其中我有一个模块OtpGenerator
。 在这个模块中,我有generate_otp
、verify_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 中的工作方式。一旦模块包含在类中,它就会继承模块的所有方法,并且模块可以访问所包含类的上下文。
希望能回答您的问题