2016-03-15 1 views
0

Je ne peux pas obtenir reminder.rake pour travailler en production. J'ai une erreurNoMethodError: méthode indéfinie '' pour principal: Object - à chaque fois planificateur

namespace :challenges do 
    desc 'Send email to users with challenges who want reminder' 
    task challenge_reminder: :environment do 
    self.all.each do |challenge| 
     UserMailer.challenge_reminder(self).deliver_now # Tried (challenge) instead of (self), same error too 
    end 
    end 
end 

ordonnanceur heroku

enter image description here

erreur de trace

Anthony-Gallis-MacBook-Pro:livetochallenge galli01anthony$ heroku run rake challenges:challenge_reminder --trace 
Running rake challenges:challenge_reminder --trace on livetochallenge... up, run.7666 
rake aborted! 
NoMethodError: undefined method `all' for main:Object 
/app/lib/tasks/reminder.rake:4:in `block (2 levels) in <top (required)>' 
Tasks: TOP => challenges:challenge_reminder 
(See full trace by running task with --trace) 
Anthony-Gallis-MacBook-Pro:livetochallenge galli01anthony$ 

En tant exemple j'ai ci-dessous travaille donc je sais que ce n'est pas un problème mettre en place le whenever gem ou programmateur Heroku:

namespace :challenges do 
    desc 'Clean the challenge freebies and freebie_dates' 
    task clean: :environment do 
    Challenge.update_all(freebie: 0, freebie_date: nil) 
    end 
end 
+0

Quelle est la ligne des lignes que vous avez collées ici? – tadman

+0

Ce n'est pas une source. Quelle est la ligne 4 de ce fichier? Est-ce l'extrait à la fin? – tadman

+0

Vous n'avez toujours pas clarifié ce que contient la ligne 4 de ce fichier. Il y a une référence à 'rake' là-dedans qui ne devrait pas être présent. – tadman

Répondre

1

Il y a un problème ici avec votre tâche Rake:

task challenge_reminder: :environment do 
    self.all.each do |challenge| 
    UserMailer.challenge_reminder(self).deliver_now 
    end 
end 

Ici self fait référence au contexte de la tâche Rake, pas le modèle où ce code origine. Vous aurez également besoin de faire quelque chose avec challenge ou il n'y a aucun intérêt à le récupérer.

Correction proposée:

task challenge_reminder: :environment do 
    Challenge.all.each do |challenge| 
    UserMailer.challenge_reminder(challenge).deliver_now 
    end 
end 

Rappelez-vous que l'appel .all sur un modèle avec beaucoup de dossiers peuvent utiliser d'énormes quantités de mémoire et peut se bloquer votre serveur si elle est trop énorme, car Rails charge chaque enregistrement unique en Mémoire. Si vous en avez des millions, vous êtes probablement toasté.

Lorsque vous essayez de remonter à des problèmes, regardez d'abord la ligne référencée dans l'erreur et revenez à partir de là. La trace de pile de Ruby est généralement assez spécifique pour être à la racine du problème.

+1

selon la version de Rails une suggestion de 'in_batches' ou' find_in_batches' ou 'find_each' si vous ne vous souciez pas de la taille de lot par défaut de 1000 pour gérer ces grands ensembles de données que vous êtes parler pourrait valoir la peine. – engineersmnky

1

Selon la trace, ressemble à la ligne 4 du fichier /app/lib/tasks/clear_deadline.rake se réfère à rake, ce qui est pourquoi il échoue.

Vérifiez le contenu du fichier ou indiquez le code de ce fichier.

+0

Merci d'avoir limité le problème. J'ai mis à jour la question pour aller à la racine du problème avec ce fichier. Mais je vous donne beaucoup plus comme des remerciements:] –