# rails的邮件目录规划统一

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)
        @order = order
        mail(to: @order.buyer_email, subject: "新的订单邮件")
      end
    end
    

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

完。。
