分享 rails 的邮件目录规划统一

moliliang · 2018年03月02日 · 1198 次阅读

转载至自己的博客 http://huoxr.com/rails/2018/03/02/mailer-dir.html

Rails 的 Mailer 目录停蛋疼的,没统一。

比如订单的邮箱 OrderMailer,目录默认在 views/order_mailer 下。

如果你又有别的邮件,比如提现 WithdrawMailer 默认目录又在 views/withdraw_mailer。

如果你有很多种的邮件类型,每次建立一个 mailer,views 下就多一个 mailer 目录,可能有点强迫症,mailer 很影响 views 的目录结构美观呢!

所以我决定改一下,把所有的 mailer 都放在 views/mailers 目录下

我想,大一点的项目,应该有规划 mailer 的目录吧,结果看了下 gitlab 这个项目,也木有。。

所以啥也别说了,先看源码,看看怎么改。

打开 rails 的附带 gem actionmailer 中的 action_mailer/base.rb 文件

找到 def mail 方法

def mail(headers = {}, &block)
    ……
    # Render the templates and blocks
    responses = collect_responses(headers, &block)
    ……
end

顺着 collect_responses 方法,再找到

collect_responses_from_templates(headers)


templates_path = headers[:template_path] || self.class.mailer_name
templates_name = headers[:template_name] || action_name

上面的代码发现原来 headers 中可以传参数来指定模板目录……然后 Dash 看了下 mail 方法,上面还真写着。。(心里暗骂自己一句傻逼)

行了,继承 ApplicationMailer,重写 mail 方法

class BaseMailer < ApplicationMailer
  def mail(headers, &block)
    subdir = self.class.name.remove('Mailer').downcase
    headers.merge!(template_path: "mailers/#{subdir}")
    super
  end
end
class OrderMailer < BaseMailer
  def paid(order)
    mail(to: order.buyer_email, subject: "新的订单邮件")
  end
end

现在 paid 将在 views/mailers/order/paid.html.haml 中找到该文件。

完。。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号