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

根据本指南,似乎add_template_helper(helper_module)方法可以做我想做的事情,但我不知道如何使用它。

(顺便说一句,你在邮件视图中访问不同的一组助手有什么原因吗?这很烦人。)


当前回答

在Rails4的例子中,我喜欢这样:

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  add_template_helper ApplicationHelper
  ...
end

and

# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
  def some_method(x, y)
  end
end

这样您就不必在任何地方指定add_template_helper。

其他回答

在Rails4的例子中,我喜欢这样:

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  add_template_helper ApplicationHelper
  ...
end

and

# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
  def some_method(x, y)
  end
end

这样您就不必在任何地方指定add_template_helper。

你可以添加你的邮件

helper :application

或者任何你需要的帮手

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

(1)正如Duke已经说过的,如果你想添加的助手是UsersHelper,那么添加

helper :users

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

在那之后,我得到了一个新的错误:

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

要修复此问题,请添加该行

config.action_mailer.default_url_options = { :host => 'localhost' }

到每个配置/环境/*。rb文件。配置/环境/生产。Rb,将localhost替换为生产助手生成的url的更合适的主机。


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

答:因为常规视图不需要知道主机,因为所有生成的链接都是由它们链接到的主机提供的。在电子邮件中出现的链接不是来自同一个主机(除非你链接到hotmail.com或gmail.com等)。

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

helper :mail   # loads app/helpers/mail_helper.rb & includes MailHelper

我只是传入了一个block,因为我只需要它在一个Mailer中:

helper do
  def host_url_for(url_path)
    root_url.chop + url_path
  end
end

(请确保设置config.action_mailer.default_url_options。)

(如果你使用url_for,一定要传入:only_path => false)

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

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end