ruby-on-rails – 如何避免ActionMailer ::预览提交数据到开发数据库?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何避免ActionMailer ::预览提交数据到开发数据库?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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

猜你在找的Ruby相关文章