加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:40:15 所属栏目:百科 来源:网络整理
导读:我使用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.invi
我使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读