2016-07-06 9 views
0

私はモジュールOtpGeneratorを持っている宝石を建てています。このモジュールの中には、generate_otpverify_otpなどのメソッドがあります。これは、私と非常に簡単な宝石の生成と検証と保存と送信だけのためのものです。今、この宝石を使用する人は、このモデルをモデルに含める必要があります。例えば、 userモデルがあります。今私がしたいことは最初に私がruby​​-on-railsモデルでgem-modulesを混在させる方法

user = User.new(params[:user])

インスタンスが作成されますされ、今私は、これはActiveRecordの場合にOTP関連のものを割り当てます、操作user.generate_otpを行う必要があります。

そのあとuser.saveです。これも問題ありません。

しかし、私はまた、otpを生成するのと同じようにすべてのタスクを実行し、保存して送信する関数generate_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 

このコードのための私のコードはまだ開発中ですが、私はちょうどすなわち、すべての3つの操作を行いますされ、generate_otp!機能を実装する方法をことを知ってほしい、 (1)これはあなたの中にミックスインである場合は、OTP(user.generate_otp)が (2)OTP(user.save) (3)OTPを送信します(問題はないthatsの私は、送信機能を作成しました。)

+0

あなたはgenerate_otp!あなたがそれを記述したのと同じくらい簡単でなければなりません!実行される順序で3つのメソッドを追加します。私が実際に見ることのできる1つの問題は、生成されたOTPがどこにも格納されていないように見えることです。なぜなら、検証には – oreoluwa

+0

'generate_otp! 'メソッドの参照が必要であると確信しているからです。私の宝石のモジュールはモデルに含まれます。 'user.generate_otp!'が呼び出されたとき、私は自分のモジュールに 'user.save'をどのように実装するのか分かりません。 – Sinscary

答えて

1

を節約生成あなたのモデルもそれにアクセスできる必要があります。ここでは、私が何を意味するかです:あなたはので、相続がRubyで仕事のやり方でうまくいくUser.find(45).generate_otp!

を呼び出す

class User 
    include OtpGenerator 
end 

module OtpGenerator 
... 
    def generate_otp! 
    generate_otp 
    save 
    send_generated_otp 
    end 
end 

。モジュールがクラスに含まれると、モジュールのすべてのメソッドを継承し、モジュールは含まれているクラスのコンテキストにアクセスします。

あなたの質問にお答えします。

+0

返信には@oreoluwaに感謝しますが、私はrubyに新しいので、私はまだmixinについて学んでいますので、あなたが特定したように、 'user.generate_otp! 'を呼び出すと3つのメソッドがすべて呼び出され、つまり、 'user.generate_otp'、' user.save'、そして私のsend関数よりです。私はsave関数が実装されていないことに注意してください。データベースに詳細を保存するのはinbuilt関数です。 – Sinscary

+0

私は指定されたアプリケーション開発者がすべてのパラメータ、すなわち 'user = User.new(params [:user])'を取得する新しいインスタンス変数 'user'を作成するためです。今度は 'user.save'がdbの詳細を保存します。あなたは経験豊かな人のように見えます。 – Sinscary

+0

はい、 'save'はActiveRecordです。しかし、あなたはActiveRecordインスタンスの範囲に宝石を含めるので、saveメソッドを呼び出すことができます。 – oreoluwa

関連する問題