2016-04-18 15 views
1

Ich habe eine sehr kleine Anwendung in Schienen erstellt, wo ich eine Modulmethode in/lib erstellt habe, um die Logik zu behandeln.Kann ich Immer wenn Gem mit einer Modulmethode in Rails

Ich habe auch eingerichtet, wann immer diese Modul-Methode zu festgelegten Zeiten ausgeführt werden soll. Ich habe sowohl die readme from Whenever und diese previousposts gefolgt, um hoffentlich die Dinge richtig einzurichten.

Wenn bei der Readme suchen, obwohl die Beispiele wie folgt zitiert werden: deshalb

every 3.hours do 
    runner "MyModel.some_process" 
    rake "my:rake:task" 
    command "/usr/bin/my_great_command" 
end 

every 1.day, :at => '4:30 am' do 
    runner "MyModel.task_to_run_at_four_thirty_in_the_morning" 
end 

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot 
    runner "SomeModel.ladeeda" 
end 

Meine Frage ist, wann immer hat ein Verfahren in dem Modell verweisen? Oder kann es eine Modulmethode in/lib referenzieren? Looking at this post es scheint auf die Methode in dem Modell zu haben.

Mein Problem ist, dass ich keine Datenbank und so keine Modelle habe.

Jede Hilfe wäre willkommen.

Antwort

0

Es kann eine Methode in einer beliebigen Klasse oder einem beliebigen Modul referenzieren. (Ein Modul ist nur eine Klasse, die nicht instanziiert werden kann). Wenn es einige Zwischendaten gibt, die Sie zwischen Methoden in Ihrem Modul übergeben müssen, hilft es manchmal, das Modul zu einer PORO-Klasse (einfaches altes Ruby-Objekt) zu machen, die Sie instanziieren können (dh die Methoden new und initialize verwenden). und Sie können Werte in attr_accessor Attributen speichern, die für alle Instanzmethoden für dieses Objekt verfügbar sind.

+0

hi @SteveTurczyn danke für Ihre Antwort. es klärt die Dinge ein wenig besser für mich. Ich habe eine Beschreibung in @ Uzbekjon Antwort, was ich falsch gemacht habe, und warum ich verwirrt war von der Readme-Syntax für Wann immer. Im Grunde hat 'MyModel' in' runner "MyModel.some_process" 'mich total geworfen. – Cliff

0

Sie müssen die Methoden nicht nur bei Modellen aufrufen. Soweit eine Klasse/ein Modul in Ihrem aktuellen Umfang verfügbar/erreichbar ist, können Sie sie aufrufen. Da runner auf Modelle zugreifen kann, haben Sie wahrscheinlich auch die App "Wann immer gem" auf "Rails laden" eingerichtet. Es bedeutet, dass es auch auf alle Klassen/Module in Ihrem Ordner /lib zugreifen kann.

So gehen Sie vor und rufen Sie dann in Ihrem wann immer:

every 3.hours do 
    runner "YourModule.some_method" 
end 

Wenn Sie keine Rails spezifische Funktionen verwenden, würde ich vorschlagen, nicht Rails env zu laden. Sie würden erhebliche Ressourcen sparen und schneller arbeiten.

Erstellen Sie alternativ eine rake Task, die die Verarbeitung ausführt und stattdessen diese aufruft. Als einen Vorteil würden Sie mit einer Rake-Aufgabe enden, die Sie anrufen und testen können.

every 3.hours do 
    rake "cron:my_process" 
end 
+0

Hallo @ Uzbekjon Danke für Ihre Antwort. Um Ihnen mehr Einblick zu geben, war der Grund, warum ich diese Frage gestellt hatte, dass Sie, wie Sie sich vorstellen können, versucht habe, die Modulmethode aus der route.rb-Datei aufzurufen, und sie hat nicht funktioniert. In einer vollständigen Amateur-Bewegung hatte ich nicht den richtigen Weg zur Ausgabe der Fehler von Cron definiert. Als ich das tat, bekam ich einen Fehler, der mein Problem löste: '/ bin/bash: Bündel: Befehl nicht gefunden' – Cliff