2017-10-16 2 views
0

Je suis nouveau à Rails et je suis confronté à un problème: Je dois construire une application pour un espace de coworking. Les pigistes remplissent un formulaire et peuvent avoir l'un de ces deux statuts: accepter ou confirmer. Je gère cela avec le type Enum. Je peux obtenir leurs mails: Freelancer.confirm.map {| freelancer | freelancer.email}Comment obtenir des mails correctement

Dans la console Rails:

Freelancer Load (2.8ms) SELECT "freelancers".* FROM "freelancers" WHERE "freelancers"."status" = ? [["status", 0]] => ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"]

Mais je ne peux pas l'utiliser correctement dans mon application:

Dans mes app/modèles/freelancer.rb

class Freelancer < ApplicationRecord 
    enum status: [:confirm, :accept] 

    def send_contract_email 
     UserMailer.contract_email(self).deliver_now 
    end 
end 

Dans l'application/mailers/user_mailer.rb

class UserMailer < ApplicationMailer 
    def contract_email(freelancers) 
     @emails = freelancers.accept.map{|freelancer| freelancer.email} 
     mail(to: @emails, subject: 'Welcome to my site') 
    end 
end 
Dans

lib/tâches/email_tasks.rake

desc 'send contract email' 
task send_contract_email: :environment do 
    UserMailer.contract_email(freelancers).deliver_now 
end 

Dans config/environnements/schedule.rb (fixé à 5 minutes pour plus de commodité)

every '5 * * * *' do 
    rake 'send_contract_email' 
end 

Et app/views/user_mailer/contract_email. html.erb

<!DOCTYPE html> 
<html> 
    <head> 
     <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> 
    </head> 
    <body> 
     <h1>Hi!</h1> 
    </body> 
</html> 

Quand je lance râteau send_contract_email pour tester tout fonctionne et vérifier si l'e-mail est envoyé ou non, il affiche une erreur:

rake aborted! NameError: undefined local variable or method freelancers' for main:Object /home/gaelle/Bureau/corworking/coworking/lib/tasks/email_tasks.rake:3:in block in ' /home/gaelle/.rvm/gems/ruby-2.4.1/gems/rake-12.1.0/exe/rake:27:in <top (required)>' /home/gaelle/.rvm/gems/ruby-2.4.1/bin/ruby_executable_hooks:15:in eval' /home/gaelle/.rvm/gems/ruby-2.4.1/bin/ruby_executable_hooks:15:in `' Tasks: TOP => send_contract_email (See full trace by running task with --trace)

Le problème semble être en UserMailer mais je ne comprends pas pourquoi je me trompe parce que j'utilise Freelancer (avec auto) dans le modèle. Merci pour votre aide!

+0

C'est assez évident - vous utilisez la variable 'freelancers' sans la définir dans votre tâche rake. 'UserMailer.contract_email (Freelancer.all) .deliver_now' – max

+0

Merci, ça m'a beaucoup aidé aussi! – daedalus418

Répondre

1

Il semble que dans votre tâche, send_contract_email, vous utilisez une variable locale freelancers qui n'a pas été initialisée. Vous devez définir freelancers comme étant une liste de pigistes dans la tâche avant d'appeler le UserMailer.contract_email, ou bien passer la liste dans la tâche en tant que paramètre. Here's a nice post avec des informations sur la façon de transmettre des paramètres pour effectuer des tâches.

+0

Merci pour votre conseil et lien. Je l'enregistre pour la prochaine fois. – daedalus418