如何在 ruby-on-rails 模型中混合 gem-模块

how to mixin gem-modules in ruby-on-rails model

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

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

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.

的上下文

希望能回答您的问题