我想在ReportMailer视图(app/helpers/annotations_helper.rb
)中使用我在app/views/report_mailer/usage_report.text.html.erb
中定义的方法。我该怎么做?
基于this guide似乎add_template_helper(helper_module)
方法可能会做我想要的,但我无法弄清楚如何使用它。
(顺便说一下,你有没有理由在邮件程序视图中访问一组不同的助手?这很烦人。)
答案 0 :(得分:310)
在用于管理电子邮件的邮件程序类中:
class ReportMailer < ActionMailer::Base
add_template_helper(AnnotationsHelper)
...
end
答案 1 :(得分:156)
在Rails 3中,只需使用ActionMailer类顶部的辅助方法:
helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper
我刚刚进入一个区块,因为我只需要一个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 =&gt; false)
答案 2 :(得分:28)
对于Rails 3中的所有邮件程序(设置“应用程序”帮助程序):
# config/application.rb:
...
config.to_prepare do
ActionMailer::Base.helper "application"
end
答案 3 :(得分:23)
对于Ruby on Rails 4,我必须做两件事:
(1)正如Duke已经说过的那样,如果要添加的助手是UsersHelper
,那么添加
helper :users
到派生的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)
要解决此问题,请添加
行config.action_mailer.default_url_options = { :host => 'localhost' }
到每个config/environments/*.rb
个文件。对于config/environments/production.rb
,请将localhost
替换为生产帮助程序生成的网址的更合适的主机。
问:对于#2,为什么邮件视图需要此信息,常规视图不需要?
答:因为常规视图不需要知道host
,因为所有生成的链接都是从他们链接的主机提供的。显示在电子邮件中的链接不会在同一主机上提供(除非您要链接到hotmail.com
或gmail.com
等)。
答案 4 :(得分:19)
您只需添加邮件
即可helper :application
或您需要的任何助手
答案 5 :(得分:5)
在我的Rails4案例中,我喜欢这样:
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
add_template_helper ApplicationHelper
...
end
和
# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
def some_method(x, y)
end
end
这样您就不必在任何地方指定add_template_helper
。
答案 6 :(得分:5)
(这是一个古老的问题,但是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
我可以创建一个都使用该助手的动态电子邮件主题行和模板,但是我需要告诉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
我应该提到这两行同样有效,所以选择其中之一:
helper :application
add_template_helper(ApplicationHelper)
FWIW,位于 app / views / user_mailer / party_thanks.html.erb 的电子邮件模板如下:
<p>
Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>
app / controller / party_controller.rb 控制器如下所示
class PartyController < ApplicationController
...
def create
...
UserMailer.with(party: @party).party_thanks.deliver_later
...
end
end
我必须同意OP(@Tom Lehman)和@gabeodess的观点,鉴于https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers,这一切都让人感到困惑,所以也许我错过了一些东西...
答案 7 :(得分:2)
这就是我在 Rails 6 中所做的
class ApplicationMailer < ActionMailer::Base
default from: 'community@example.com'
layout 'mailer'
# Add whatever helper you want
helper :application
end