web-dev-qa-db-fra.com

Erreur de courrier manquant modèle

Bonjour, 

J'ai un problème avec ActionMailer , lorsque j'essaie d'exécuter l'action:

rake send_email

Je reçois une erreur:

    rake aborted!
ActionView::MissingTemplate: Missing template user_mailer/mailer with "mailer". Searched in:
  * "user_mailer"

Voici mon:

mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  def mailer(user)
    @user = user
    mail(to: @user.email, subject: 'Test')
  end

end

views/user_mailer/mailer.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <p>
      Sample mail.
    </p>
  </body>
</html>

views/user_mailer/mailer.text.erb

Sample mail.

lib/tasks/emails_task.rake

desc 'send email'
task send_email: :environment do
  UserMailer.mailer(User.last).deliver!
end

config/environnements/development.rb

# I recommend using this line to show error
  config.action_mailer.raise_delivery_errors = true

  # ActionMailer Config
  config.action_mailer.delivery_method = :letter_opener

# config.action_mailer.default_url_options = { :Host => 'localhost:3000' }
# config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.smtp_settings = {
 :address              => "smtp.gmail.com",
 :port                 => 587,
 :user_name            => ENV['gmail_username'],
 :password             => ENV['gmail_password'],
 :authentication       => "plain",
:enable_starttls_auto => true
}

# Send email in development mode?
config.action_mailer.perform_deliveries = true

J'ai cherché la solution sur stackoverflow et j'ai essayé plusieurs des réponses au problème similaire mais malheureusement aucune d'entre elles n'a fonctionné pour moi.

J'ai trouvé la solution quand j'ajoute body à la méthode mailer comme: 

def mailer(user)
  @user = user
  mail(to: @user.email, subject: 'Test', body: 'something')
end

Ensuite, cela fonctionne mais j'aimerais avoir un corps dans des fichiers séparés et le rendre plus complexe avec un nom d'utilisateur et d'autres choses.

Si quelqu'un a une idée sur la façon de résoudre ce problème, je vous en serais très reconnaissant :)

19
Kattaro

Essayez d'ajouter une mise en page

class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  layout "mailer"

  def mailer(user)
   @user = user
   mail(to: @user.email, subject: 'Test')
 end

end
3
Florin Ionita

J'ai renommé ma méthode et cela a fonctionné. Peut-être que le nom de la méthode ne peut pas être mail ou mailer ...

2
montrealmike
class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  layout "mailer"

  def mailer(user)
   @user = user
   mail(to: @user.email, subject: 'Test')
 end

end

Ajouter une mise en page HTML sous la mise en page # 

mailer.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      /* Email styles need to be inline */
    </style>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

Ajouter une mise en page sous la mise en page # 

mailer.text.erb

<%= yield %>

Utilisez preview pour vérifier votre courrier électronique en fonction de votre framework de test.

2
sukanta

Pourriez-vous publier un référentiel minimaliste Github reproduisant votre erreur?

Vous pouvez essayer de générer votre courrier afin de vérifier que vous n’oubliez pas quelque chose:

bundle exec Rails generate mailer mailer_classname mailer_viewname

Dans ton cas:

bundle exec Rails generate mailer user_mailer mailer

1
Habax

Il est probable que Rails ne trouve tout simplement pas les fichiers que vous venez de créer. Si vous avez la gemme spring en cours d'exécution, c'est peut-être le problème. (Plus de détails sur le printemps: https://github.com/Rails/spring )

Pour configurer les commandes de terminal et arrêter l'exécution de spring:

 $ bundle exec spring binstub --all
 $ bin/spring stop

J'ai essayé cela, puis j'ai relancé mon application avec Rails s. Cela n'a pas fonctionné, essayez de fermer complètement le terminal et de redémarrer votre ordinateur. Exécutez Rails s et essayez de tester avec Rails c dans un deuxième onglet:

 mail = UserMailer.mailer(User.last)

Ce enfin a fonctionné pour moi, j'espère que cela aidera certains d'entre vous!

(Certaines de ces étapes peuvent être redondantes.)

1
Matt Kandler

J'ai eu le même problème. Le redémarrage de sidekiq l'a résolu pour moi. 

1
Jan Gerritsen

J'ai eu le même problème, ma solution était de supprimer le fichier modèle mailer, dans votre cas views/user_mailer/mailer.html.erb et de le créer à nouveau. Il semble que j’ai créé un fichier avec le nom propre, mais avec un espace blanc étrange, et ActionMailer ne l’a pas reconnu.

0
Ivica Lakatoš