27

我有一个小的组织问题,在我的应用程序中我有 3 个邮件程序 User_mailer、prduct_mailer、some_other_mailer 并且他们都将他们的视图存储在 app/views/user_mailer ...

我希望在 /app/views/ 中有一个名为 mailers 的子目录,并将所有内容放在 user_mailer、product_mailer 和 some_other_mailer 文件夹中。

谢谢,

4

6 回答 6

36

你真的应该用你的默认值创建一个ApplicationMailer类,并从你的邮件中继承:

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  append_view_path Rails.root.join('app', 'views', 'mailers')
  default from: "Whatever HQ <hq@whatever.com>"
end

# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def say_hi(user)
    # ...
  end
end

# app/views/mailers/user_mailer/say_hi.html.erb
<b>Hi @user.name!</b>

这个可爱的模式使用与控制器相同的继承方案(例如ApplicationController < ActionController::Base)。

于 2015-04-22T18:27:34.003 回答
24

我非常同意这个组织策略!

从大雄的例子中,我通过以下方式实现了它:

class UserMailer < ActionMailer::Base
  default :from => "whatever@whatever.com"
  default :template_path => '**your_path**'

  def whatever_email(user)
    @user = user
    @url  = "http://whatever.com"
    mail(:to => user.email,
         :subject => "Welcome to Whatever",
         )
  end
end

它是特定于 Mailer 的,但还不错!

于 2013-09-02T18:32:55.440 回答
14

我在 3.1 中有一些运气

class UserMailer < ActionMailer::Base
  ...
  append_view_path("#{Rails.root}/app/views/mailers")
  ...
end 

在 template_root 和 RAILS_ROOT 上收到弃用警告

于 2012-06-05T04:39:56.897 回答
14

如果你碰巧需要一些非常灵活的东西,继承可以帮助你。

class ApplicationMailer < ActionMailer::Base

  def self.inherited(subclass)
    subclass.default template_path: "mailers/#{subclass.name.to_s.underscore}"
  end

end
于 2015-10-23T22:28:58.987 回答
4

您可以将模板放在任何您想要的位置,但您必须在邮件程序中指定它。像这样的东西:

class UserMailer < ActionMailer::Base
  default :from => "whatever@whatever.com"

  def whatever_email(user)
    @user = user
    @url  = "http://whatever.com"
    mail(:to => user.email,
         :subject => "Welcome to Whatever",
         :template_path => '**your_path**',
         )
  end
end

查看2.4 Mailer Views了解更多信息。

于 2012-04-04T19:41:07.007 回答
0

简单的解决方案:指定路径ApplicationMailer

class ApplicationMailer < ActionMailer::Base      
  layout 'mailer'
  prepend_view_path "app/views/mailers"  # <---- dump your views here
end 
于 2022-01-06T01:05:59.307 回答