我正在构建一个我有模块OtpGenerator
的宝石。在这个模块中我有generate_otp
,verify_otp
等方法。这只是我的开始,它只是生成和验证,保存和发送的非常简单的宝石。现在任何使用这个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(我已经创建了send函数,所以这不是问题。)
答案 0 :(得分: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中的工作方式,这将有效。一旦模块包含在一个类中,它就会继承模块的所有方法,并且模块可以访问所包含类的上下文。
希望能回答你的问题