web-dev-qa-db-fra.com

Accéder aux aides de mailer?

J'ai essayé d'accéder à des méthodes d'assistance à partir d'un programme de messagerie Rails 3 afin d'accéder à l'utilisateur actuel pour la session. 

Je mets l'assistant: application dans ma classe mailer, ce qui semble fonctionner, sauf que les méthodes définies ne sont pas disponibles pour mon mailer (j'obtiens des erreurs non définies). Est-ce que quelqu'un sait comment cela est censé fonctionner?

Voici ma classe: 

class CommentMailer < ActionMailer::Base
  default :from => "Andre Fournier <[email protected]>"

  helper :application
end

Merci, Sean

44
Sean O'Hara

Pour vous permettre d'accéder aux aides d'application à partir des vues ActionMailer, essayez d'ajouter ceci:

add_template_helper(ApplicationHelper)

À votre ActionMailer (juste en dessous de votre ligne default :from).

69
William Denniss

Utilisez helper ApplicationHelper

class NotificationsMailer < ActionMailer::Base

  default from: "Community Point <[email protected]>"
  helper ApplicationHelper
  helper NotificationMailerHelper

  # ...other code...

REMARQUE: Ces méthodes d'assistance sont uniquement disponibles pour les vues. Ils ne sont pas disponibles dans la classe mailer (NotificationMailer dans mon exemple).

Si vous en avez besoin dans la classe de publipostage, utilisez include ApplicationHelper, comme suit: 

class NotificationMailer < ActionMailer::Base

  include ApplicationHelper

  # ... the rest of your mailer class.

end

De cette autre SO question .

45
Joshua Pinter

C'est une très vieille question, mais je ne vois pas la réponse complète, alors je vais essayer car je n'ai pas trouvé d'autre ressource.

Cela dépend de ce que vous faites avec les méthodes définies dans le module d'assistance. Si ce sont des méthodes de classe et que tout ce qui n'est pas appelé sur une instance spécifique semble être une méthode de classe pour 3.2.13, vous devez utiliser

extend ApplicationHelper

si une méthode d'instance

include ApplicationHelper

et si vous voulez les utiliser dans une vue mailer

helper ApplicationHelper
24
Questor

Vous pouvez essayer de mélanger le module d'aide requis:

class CommentMailer < ActionMailer::Base
  include ApplicationHelper
end
8
dangerousdave

include ActionView::Helpers::TextHelper a travaillé pour moi dans le contrôleur de courrier (fichier .rb). Cela m'a permis d'utiliser l'assistant de pluriel dans une action du contrôleur Mailer (les helpers fonctionnaient bien dès le début dans les vues Mailer). Aucune des autres réponses n'a fonctionné, du moins pas sur Rails 4.2

3
wetjosh

La réponse de Josh Pinter est correcte, mais j'ai découvert que ce n'était pas nécessaire.

Ce queestnécessaire est de nommer correctement l’assistant.

NotificationMailerHelper est correct. NotificationMailersHelper (notez le s) n'est pas correct.

La classe et le nom de fichier de l'assistant doivent correspondre et être correctement orthographiés.

Rails 3.2.2

3
B Seven

La version à méthode unique de promotion d’une méthode en tant qu’assistant disponible dans ApplicationController fonctionne également dans ActionMailer:

class ApplicationMailer < ActionMailer::Base
  helper_method :marketing_Host

  def marketing_Host
    "marketing.yoursite.com"
  end
end

à partir de là, vous pouvez appeler marketing_Host à partir de l’une de vos vues de publipostage

2
stcorbett

Si vous souhaitez appeler une méthode d'assistance à partir d'ActionMailer, vous devez inclure helper (module) dans le fichier courrier en tant que, si le nom du module d'assistance est «UserHelper», vous devez écrire ce qui suit dans le fichier courrier

class CommentMailer < ActionMailer::Base
    default :from => "Andre Fournier <[email protected]>"
    add_template_helper(UserHelper)
end

Ou

class CommentMailer < ActionMailer::Base
    default :from => "Andre Fournier <[email protected]>"
    include UserHelper
end

J'espère que c'est utile.

2
PythonDev

Je ne sais pas exactement ce que vous faites ici, mais lorsque je veux accéder à current_user à partir d'un mailer, je crée une méthode de mailing à laquelle je passe l'utilisateur en argument:

class CommentMailer < ActionMailer::Base
  default :from => "Andre Fournier <[email protected]>"

  def blog_comment(user)
    @recipients                   = user.email
    @from                         = "[email protected]"
    @sent_on                      = Time.now
    @timestamp                    = Time.now
    @user                         = user
  end
end

Avec ce qui précède, @user, ainsi que toutes les autres variables d'instance, sont accessibles depuis les vues de l'éditeur ./views/comment_mailer/blog_comment.html.erb et ./views/comment_mailer/blog_comment.text.erb

Séparément, vous pouvez créer un assistant appelé

comment_mailer_helper.rb

et mettez dans cette aide toutes les méthodes que vous voulez être disponibles pour les vues de votre expéditeur. Cela me semble plus comme ce que vous voudriez peut-être, en ce qui concerne les aides, car les aides sont conçues pour aider les vues, alors qu'un mailer est analogue à un contrôleur.

1
fengolly

Aucun des assistants *_path n'est accessible par défaut dans un courrier électronique. Au lieu de cela, il est nécessaire d’utiliser la forme *_url de l’assistant demandé. Ainsi, par exemple, au lieu d’utiliser user_path(@user), il est nécessaire d’utiliser user_url(@user). Voir à la page Principes de base de l’Action Mailer .

0
Asarluhi