Rails - 使用布局为所有电子邮件使用相同的附件

dbw*_*ger 7 actionmailer ruby-on-rails-3

我可能错过了一些明显的东西,但我有一个徽标,我想要包含在我从我的应用程序发送的所有电子邮件中.我有一个主布局,我正在使用所有这些邮件.我假设有一种方法可以保持干燥,而不必在每个邮件程序方法中添加代码行来附加文件.有人能指出我正确的方向或纠正我的思路.

谢谢!

Jus*_*geb 7

未来的Rails版本将支持使用before_filter和after_filter的回调:

http://github.com/rails/rails/commit/4f28c4fc9a51bbab76d5dcde033c47aa6711339b

由于它们将使用AbstractController :: Callbacks实现,因此您可以执行以下操作来模拟在Rails 4发布后将在ActionMailer :: Base中出现的功能:

class YourMailer < ActionMailer::Base
  if self.included_modules.include?(AbstractController::Callbacks)
    raise "You've already included AbstractController::Callbacks, remove this line."
  else
    include AbstractController::Callbacks
  end

  before_filter :add_inline_attachments!

  private
  def add_inline_attachments!
    attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
  end
end
Run Code Online (Sandbox Code Playgroud)

这包括将在未来的rails版本中使用的模块,因此可用的回调挂钩将是相同的,以确保将来的兼容性.当您尝试升级到已包含AbstractController :: Callbacks的Rails版本时,代码将引发,因此将提醒您删除条件逻辑.


Shi*_*hiv 1

在您的邮件程序使用的布局文件中,您可以添加以下内容

<%= image_tag('logo.png') %>
Run Code Online (Sandbox Code Playgroud)

我假设发送的邮件是 html 或多部分的。

您还需要更改环境文件。ActionMailer 没有获得默认的base_url。例如在environments/development.rb中我添加了以下内容

config.action_mailer.default_url_options = { :host => "localhost:3000" }
Run Code Online (Sandbox Code Playgroud)

如果你想以一种干巴巴的方式来做(并作为附件),也许你可以做类似的事情

class MyMailer < ActionMailer::Base
  default :attachment => File.read(File.join(Rails.root,'public','images','logo.png'))
end
Run Code Online (Sandbox Code Playgroud)