2009-02-16 9 views

risposta

12

Un'altra opzione è creare un'attività rake eseguita da un processo cron. Per fare ciò, creare un file some_file.rake e inserirlo nella cartella lib/tasks. Il file potrebbe essere simile a questo:

Rails 2.x:

task :send_daily_mail, :needs => :environment do 
    Model.send_daily_mail 
end 

Rails 3.x:

task :send_daily_mail => :environment do 
    Model.send_daily_mail 
end 

Poi usare cron per eseguire tutte le volte che ti piace:

cd /path/to/app && /usr/bin/rake send_daily_mail 

Nota potrebbe essere necessario inserire RAILS_ENV=production nel crontab se l'app è in modalità sviluppo per impostazione predefinita.

+0

Ho uno strano problema con questo: quando eseguo "cd/path/to/app &&/usr/local/bin/rake send_daily_mail" dalla riga di comando, funziona. Ma quando crontab tenta di eseguirlo, ho l'errore "/ usr/local/bin/rake: 9: in" require ": nessun file da caricare-- rubygems (LoadError)" da/usr/local/bin/rake : 9 " – Flackou

+0

Le attività Cron vengono eseguite di default senza il beneficio dell'ambiente di accesso completo degli utenti. Il crontab che ha funzionato per me era: */5 * * * * bash --login -c 'cd/percorso/su/app && rake send_daily_mail' – wonderfulthunk

1

Aggiungi un metodo di classe a uno dei tuoi modelli che gestirà ciò per te. Ora prova ad eseguire quel metodo usando lo script runner

./script/runner "MyModel.send_daily_mail" RAILS_ENV=production 

Verificare che tutto funzioni correttamente. In tal caso, è necessario che il comando funzioni universalmente impostando correttamente il percorso del progetto.

cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production 

Ora passare a qualsiasi indirizzamento casuale ed eseguire tale comando. Se funziona correttamente, esegui crontab -e e inserisci il comando in questa configurazione per l'esecuzione giornaliera alle 7:00. Ci sono un sacco di spiegazioni sul formato cron in questo caso se si usa google per loro e dovrebbe essere abbastanza semplice da capire.

+0

Grazie mille per questa risposta.È possibile gestirlo da un file specifico (come lib/tasks/send_mail.rb) piuttosto che nel metodo di un modello? – Flackou

7

sono rimasto impressionato dalla (e in programma di provare) la gemma rufus-scheduler discusso in this blog post

Egli descrive qualcosa di simile:

scheduler = Rufus::Scheduler.start_new 

scheduler.every("1m") do 
    DailyDigest.send_digest! 
end 

..che sembra abbastanza semplice. Mi chiedo quanto sarebbe facile aggiungere una configurazione basata su HTML?

+1

quindi? Hai provato, cosa ne pensi? –

2

BackgroundRB è ciò che utilizzo e funziona perfettamente. Ho inviato diverse email, generate da BackgroundRB. Ho anche altri compiti. Perché abilita sia le attività pianificate che le attività asincrone (attività che richiedono più tempo del normale ciclo di risposta client/server).

Lo uso e ne sono molto contento.

0

Vai con un'attività rake e cron job, come dice già la risposta accettata. Tuttavia, si noti che l'aggiornamento del file cron stesso è un'attività manuale. Potrebbe andare bene se non lo stai modificando durante lo sviluppo. Altrimenti, qui puoi fare in modo che Capistrano faccia tutto per te: http://push.cx/2008/deploying-crontab-with-your-rails-app

Problemi correlati