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

时间:2016-07-06 07:46:20

标签: ruby-on-rails ruby rubygems mixins otp

我正在构建一个我有模块OtpGenerator的宝石。在这个模块中我有generate_otpverify_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函数,所以这不是问题。)

1 个答案:

答案 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中的工作方式,这将有效。一旦模块包含在一个类中,它就会继承模块的所有方法,并且模块可以访问所包含类的上下文。

希望能回答你的问题