我想使用我在app/helpers/annotations_helper中定义的方法。rb在我的ReportMailer视图(app/views/report_mailer/usage_report.text.html.erb)。我怎么做呢?
根据本指南,似乎add_template_helper(helper_module)方法可以做我想做的事情,但我不知道如何使用它。
(顺便说一句,你在邮件视图中访问不同的一组助手有什么原因吗?这很烦人。)
我想使用我在app/helpers/annotations_helper中定义的方法。rb在我的ReportMailer视图(app/views/report_mailer/usage_report.text.html.erb)。我怎么做呢?
根据本指南,似乎add_template_helper(helper_module)方法可以做我想做的事情,但我不知道如何使用它。
(顺便说一句,你在邮件视图中访问不同的一组助手有什么原因吗?这很烦人。)
当前回答
(这是一个老问题,但Rails已经发展了,所以我分享了在Rails 5.2中对我有用的东西。)
通常情况下,您可能希望使用自定义视图助手来呈现电子邮件的主题行以及HTML。在视图helper位于app/helpers/application_helper的情况下。Rb如下:
module ApplicationHelper
def mydate(time, timezone)
time.in_time_zone(timezone).strftime("%A %-d %B %Y")
end
end
我可以创建一个动态的电子邮件主题行和模板,它们都使用helper,但我需要告诉Rails显式地在apps/mailer/user_mailer中使用ApplicationHelper。就像你在这里的第二行和第三行看到的那样,Rb有两种不同的方式:
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,这一切都感觉相当复杂,所以也许我遗漏了一些东西……
其他回答
你可以添加你的邮件
helper :application
或者任何你需要的帮手
对于Rails 3中的所有邮件(设置"application" helper):
# config/application.rb:
...
config.to_prepare do
ActionMailer::Base.helper "application"
end
在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。
这就是我在rails 6中所做的
class ApplicationMailer < ActionMailer::Base
default from: 'community@example.com'
layout 'mailer'
# Add whatever helper you want
helper :application
end
(这是一个老问题,但Rails已经发展了,所以我分享了在Rails 5.2中对我有用的东西。)
通常情况下,您可能希望使用自定义视图助手来呈现电子邮件的主题行以及HTML。在视图helper位于app/helpers/application_helper的情况下。Rb如下:
module ApplicationHelper
def mydate(time, timezone)
time.in_time_zone(timezone).strftime("%A %-d %B %Y")
end
end
我可以创建一个动态的电子邮件主题行和模板,它们都使用helper,但我需要告诉Rails显式地在apps/mailer/user_mailer中使用ApplicationHelper。就像你在这里的第二行和第三行看到的那样,Rb有两种不同的方式:
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,这一切都感觉相当复杂,所以也许我遗漏了一些东西……