2016-07-06 16 views
0

Ich baue ein Juwel, in dem ich ein Modul haben OtpGenerator. Innerhalb dieses Moduls habe ich Methoden wie generate_otp, verify_otp usw. Dies ist nur ein Anfang für mich und seine sehr einfache Juwel nur zu generieren und zu verifizieren und speichern und senden, nichts anderes. Jetzt muss jeder, der dieses Juwel benutzt, dieses Modul in sein Modell aufnehmen. für z.B. Es gibt ein user Modell. jetzt, was ich will, ist zunächst wird erstelle ich eine Instanzwie mixin gem-modules in ruby-on-rails modell

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

jetzt muss ich den Betrieb user.generate_otp tun, wird diese OTP ähnliche Dinge in der Active Instanz zuweisen.

danach user.save, die auch in Ordnung ist.

Aber ich möchte auch eine Funktion generate_otp!, die alle Aufgabe wie otp erzeugt, als speichern und senden es. Mein Problem ist, dass ich nicht verstehe, wie ich diese Funktionalität erreichen kann.

Hinweis: Ich bin sehr neu in Ruby. und wirklich verwirrt mit Mixins.

hier ist mein Code für otp.rb Datei

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 

Dieser Code noch in der Entwicklung ist, ich will nur wissen, dass, wie generate_otp! Funktion zu implementieren, die alle drei Operation tun wird, dh (1) erzeugt oTP (user.generate_otp) (2) speichert oTP (user.save) (3) sendet oTP (ich habe die Sendefunktion erstellt, so dass nicht ein Problem das ist.)

+0

beantwortet, wie Sie die generate_otp erwähnt! sollte so einfach sein wie du es beschrieben hast! füge die drei Methoden in der Reihenfolge hinzu, in der sie ausgeführt werden sollen. Ein Problem, das ich tatsächlich sehen konnte, ist, dass selbst das erzeugte OTP anscheinend nirgends gespeichert wird, was ein kleines Problem ist, da ich sicher bin, dass die Verifikation einen Verweis auf diese – oreoluwa

+0

'generate_otp!' Methode benötigt das Modul meines Edelsteins, das zum Modell hinzugefügt wird. Jetzt, wenn 'user.generate_otp!' aufgerufen wird, bin ich mir nicht sicher, wie ich 'user.save' in meinem Modul implementieren werde. – Sinscary

Antwort

1

Wenn dies ein mixin ist in Ihrem Modell, dann sollte Ihr Modell auch Zugriff darauf haben. Hier ist, was ich meine:

class User 
    include OtpGenerator 
end 

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

Wenn Sie User.find(45).generate_otp!

nennen, die aufgrund der Art und Weise Erbschaften arbeiten in Ruby funktionieren würde. Sobald das Modul in einer Klasse enthalten ist, erbt es alle Methoden des Moduls und das Modul hat Zugriff auf den Kontext der enthaltenen Klasse.

Hoffe, dass Ihre Frage

+0

danke @oreoluwa für die Antwort, aber wie ich bin neu zu Ruby ich bin immer noch lernen über Mixins, so wie Sie angegeben haben, wird es bedeuten, dass, wenn ich 'user.generate_otp!' Nennen, wird es rufen alle drei Methoden ist Reihenfolge, dh "user.generate_otp", "user.save" und meine Send-Funktion. Beachten Sie auch, dass die Speicherfunktion von mir nicht implementiert ist. Es ist die integrierte Funktion zum Speichern von Details in der Datenbank. – Sinscary

+0

weil, wie ich angegeben habe, App-Entwickler eine neue Instanzvariable 'user' erstellen wird, die alle Parameter erhält, d. H.,' User = User.new (params [: user]) '. Jetzt speichert 'user.save' Details in db. Nun, du scheinst ein erfahrener Typ zu sein, du weißt es besser als ich. – Sinscary

+0

Ja, 'save' ist ActiveRecord. Da Sie den Edelstein jedoch in den Bereich einer ActiveRecord-Instanz aufnehmen möchten, können Sie die Speichermethode aufrufen.Ich würde sagen, Sie sollten es ausprobieren, aber – oreoluwa