我使用Rails 4.1.0.beta1的新的Action Mailer预览,并具有以下代码:
class EventInvitationPreview < ActionMailer::Preview def invitation_email invite = FactoryGirl.create :event_invitation,:for_match,:from_user,:to_user EventInvitationMailer.invitation_email(invite) end end
这一切都很好,直到我实际尝试预览我的电子邮件,并得到一个错误,说由于重复的电子邮件地址,用户对象的验证失败.事实证明,ActionMailer :: Preview正在写入我的开发数据库.
虽然我可以解决验证失败或使用灯具而不是工厂,有没有办法避免ActionMailer ::预览写入开发数据库,例如使用测试数据库?还是我只是做错了?
解决方法
TL; DR – ActionMailer预览功能的原始作者(通过
MailView gem)提供了三种不同支持方法的示例:
>从现有灯具拉取数据:Account.first
>工厂样式:user = User.create!其次是user.destroy
> Stub-like:Struct.new(:email,name).new(‘name@example.com’,’Jill Smith’)
~~~~~~~~~~
阐述OP面临的挑战
这个挑战的另一个表现是尝试使用FactoryGirl.build(而不是创建)来生成非持久性数据. “Rails 4.1” – http://brewhouse.io/blog/2013/12/17/whats-new-in-rails-4-1.html?brewPubStart=1的顶级Google结果之一,在“如何使用这个新功能”的示例中提出了这种方法.这种方法似乎是合理的,但是如果您尝试根据该数据生成一个URL,则会导致以下错误:
ActionController::UrlGenerationError in Rails::Mailers#preview No route matches {:action=>"edit",:controller=>"password_resets",:format=>nil,:id=>nil} missing required keys: [:id]
使用FactoryGirl.create(而不是构建)将解决这个问题,但是如OP所示,导致开发数据库的污染.
如果您查看成为此Rails 4.1功能的原始MailView宝石的文档,则原始作者会在此情况下更清楚他的意图.也就是说,原作者提供了以下三个例子,它们都集中在数据重用/清理/非持久性上,而不是提供使用不同数据库的方法:
# app/mailers/mail_preview.rb or lib/mail_preview.rb class MailPreview < MailView # Pull data from existing fixtures def invitation account = Account.first inviter,invitee = account.users[0,2] Notifier.invitation(inviter,invitee) end # Factory-like pattern def welcome user = User.create! mail = Notifier.welcome(user) user.destroy mail end # Stub-like def forgot_password user = Struct.new(:email,:name).new('name@example.com','Jill Smith') mail = UserMailer.forgot_password(user) end end