如何在我的ActionMailer视图中使用我的视图助手?

Tom*_*man 223 ruby-on-rails

我想使用我app/helpers/annotations_helper.rb在ReportMailer views(app/views/report_mailer/usage_report.text.html.erb)中定义的方法.我该怎么做呢?

基于本指南,似乎该add_template_helper(helper_module)方法可能会做我想要的,但我无法弄清楚如何使用它.

(顺便说一下,你有没有理由在邮件程序视图中访问一组不同的帮助程序?这非常烦人.)

小智 319

在您用于管理电子邮件的邮件程序类中:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下对我不起作用(Rails 3.2.8):我有一个在ApplicationController中定义的方法,并通过helper_method:my_helper_wannabe使其成为帮助器,但是方法"my_helper_wannabe"在邮件程序中不可用. (4认同)
  • 这是一个古老的答案,但只是说这在Rails 5.2中有效 (4认同)
  • 这最终在 Rails 6.1.0.rc1 中被打破 (2认同)
  • 这在 6.1 中不起作用。对于Rails 6.1,请使用下面Duke的答案: /sf/ask/99188491/#6393071 和 ```helper :助手名称```。 (2认同)

Duk*_*uke 157

在Rails 3中,只需使用ActionMailer类顶部的helper方法:

helper :mail   # loads app/helpers/mail_helper.rb & includes MailHelper
Run Code Online (Sandbox Code Playgroud)

我刚刚进入一个区块,因为我只需要在一个邮件程序中:

helper do
  def host_url_for(url_path)
    root_url.chop + url_path
  end
end
Run Code Online (Sandbox Code Playgroud)

(务必设置config.action_mailer.default_url_options.)

(如果你使用url_for,请务必传入:only_path => false)

  • 这有效,但是在将ApplicationController中已经定义的帮助器重新指定给各个ActionMailer类时也感觉很难.ActionMailer扩展了ActionController,因此它们来自一个公共层次结构.更多关于Rails的评论而不是你的解决方案...... (3认同)
  • 如果帮助程序在命名空间中,您可以执行`helper:'namespace/mail'` (3认同)
  • 在Rails 5.2上工作! (2认同)

Edi*_*ado 28

对于Rails 3中的所有邮件程序(设置"应用程序"帮助程序):

# config/application.rb:
...
config.to_prepare do
  ActionMailer::Base.helper "application"
end
Run Code Online (Sandbox Code Playgroud)

  • 不正确 - `helper:application`在Rails 4.2.1中运行正常. (2认同)

Mat*_*att 23

对于Ruby on Rails 4,我必须做两件事:

(1)正如杜克已经说过的那样,如果你想要添加帮助器UsersHelper,那么就添加

helper :users
Run Code Online (Sandbox Code Playgroud)

到派生ActionMailer类(例如app/mailers/user_mailer.rb)

(2)之后,我收到了一个新错误:

ActionView::Template::Error (Missing host to link to! Please provide the :host
parameter, set default_url_options[:host], or set :only_path to true)
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请添加该行

config.action_mailer.default_url_options = { :host => 'localhost' }
Run Code Online (Sandbox Code Playgroud)

到每个config/environments/*.rb文件.对于生产助手生成的URL config/environments/production.rb,替换localhost为更合适的主机.


问:对于#2,为什么邮件视图需要此信息,而常规视图不需要?

答:因为常规视图不需要知道host,因为所有生成的链接都是从它们链接的主机提供的.显示在电子邮件中的链接不会从同一主机提供(除非您链接到hotmail.comgmail.com等)


use*_*228 19

您只需添加邮件即可

helper :application
Run Code Online (Sandbox Code Playgroud)

或者你需要的任何助手

  • 这是早期回复的重复 - @Shevaun (4认同)

MSC*_*MSC 10

(这是一个古老的问题,但是Rails有所发展,所以我将分享在Rails 5.2中对我有用的东西。)

通常,您可能需要使用自定义视图帮助器来呈现电子邮件和HTML的主题行。如果视图帮助程序位于app / helpers / application_helper.rb中,则如下所示:

module ApplicationHelper

  def mydate(time, timezone)
    time.in_time_zone(timezone).strftime("%A %-d %B %Y")
  end

end
Run Code Online (Sandbox Code Playgroud)

我可以创建一个都使用助手的动态电子邮件主题行和模板,但是我需要告诉Rails以两种不同的方式在apps / mailer / user_mailer.rb中显式使用ApplicationHelper ,如您在此处的第二和第三行中所见:

class UserMailer < ApplicationMailer

  include ApplicationHelper  # This enables me to use mydate in the subject line
  helper :application  # This enables me to use mydate in the email template (party_thanks.html.erb)

  def party_thanks
    @party = params[:party]
    mail(to: 'user@domain.com',
    subject: "Thanks for coming on #{mydate(@party.created_at, @party.timezone)}")
  end

end
Run Code Online (Sandbox Code Playgroud)

我应该提到这两行同样有效,因此请选择其中之一:

helper :application

add_template_helper(ApplicationHelper)
Run Code Online (Sandbox Code Playgroud)

FWIW,位于app / views / user_mailer / party_thanks.html.erb的电子邮件模板如下所示:

<p>
  Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>
Run Code Online (Sandbox Code Playgroud)

而且app / controller / party_controller.rb控制器看起来像这样

class PartyController < ApplicationController
  ...
  def create
    ...
    UserMailer.with(party: @party).party_thanks.deliver_later
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

我必须同意OP(@Tom Lehman)和@gabeodess的观点,鉴于https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers,这一切都让人感到费解,所以也许我错过了一些东西。 。


use*_*745 9

这就是我在 Rails 6 中所做的

class ApplicationMailer < ActionMailer::Base
  default from: 'community@example.com'
  layout 'mailer'

  # Add whatever helper you want
  helper :application  

end
Run Code Online (Sandbox Code Playgroud)


Yos*_*shi 5

在我的Rails4的情况下,我喜欢这样:

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  add_template_helper ApplicationHelper
  ...
end
Run Code Online (Sandbox Code Playgroud)

# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
  def some_method(x, y)
  end
end
Run Code Online (Sandbox Code Playgroud)

这样你就不必在add_template_helper任何地方指定.