如何在 ruby-on-rails 模型中混合 gem-模块
how to mixin gem-modules in ruby-on-rails model
我正在构建一个 gem,其中有一个模块 OtpGenerator
。在这个模块中,我有 generate_otp
、verify_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(我已经创建了发送功能,所以这不是问题。)
如果这是您模型中的混合宏,那么您的模型也应该可以访问它。这就是我的意思:
class User
include OtpGenerator
end
module OtpGenerator
...
def generate_otp!
generate_otp
save
send_generated_otp
end
end
当你打电话时User.find(45).generate_otp!
由于继承在 Ruby 中的工作方式,这会起作用。一旦模块包含在 class 中,它就会继承模块的所有方法,并且模块可以访问包含的 class.
的上下文
希望能回答您的问题
我正在构建一个 gem,其中有一个模块 OtpGenerator
。在这个模块中,我有 generate_otp
、verify_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(我已经创建了发送功能,所以这不是问题。)
如果这是您模型中的混合宏,那么您的模型也应该可以访问它。这就是我的意思:
class User
include OtpGenerator
end
module OtpGenerator
...
def generate_otp!
generate_otp
save
send_generated_otp
end
end
当你打电话时User.find(45).generate_otp!
由于继承在 Ruby 中的工作方式,这会起作用。一旦模块包含在 class 中,它就会继承模块的所有方法,并且模块可以访问包含的 class.
的上下文希望能回答您的问题