ruby-on-rails – Rails Active Record取消(保存或创建)before_create回调,而不会引发异常

发布时间:2020-09-16 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails Active Record取消(保存或创建)before_create回调,而不会引发异常编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
实际上,我想测试一个模型回调.

system_details.rb(Model)

class SystemDetail < ActiveRecord::Base
  belongs_to :user
  attr_accessible :user_agent

  before_create :prevent_if_same    

  def agent
    Browser.new(ua: user_agent,accept_language: 'en-us')
  end

  def prevent_if_same
    rec = user.system_details.order('updated_at desc').first
    return true unless rec
    if rec.user_agent == user_agent
      rec.touch
      return false
    end
  end
end

prevent_if_same方法工作正常并且按预期工作但是当它返回false时引发异常ActiveRecord :: RecordNotSaved,并且该异常打破了rspec测试.我想要的是,它应该默默地取消保存而不引发异常.

system_detail_spec.rb(rspec)

require 'rails_helper'

RSpec.describe SystemDetail,:type => :model do      

  context '#agent' do
    it 'Checks browser instance' do
      expect(SystemDetail.new.agent).to be_an_instance_of(Browser)
    end
  end

  context '#callback' do    
    it 'Ensure not creating consecutive duplicate records' do
      user = create :end_user
      system_detail = create :system_detail,:similar_agent,user_id: user.id
      updated_at  = system_detail.updated_at
      system_detail2 = create :system_detail,user_id: user.id
      system_detail.reload

      expect(system_detail2.id).to be_nil
      expect(system_detail.updated_at).to be > updated_at
    end
  end        
end

第二次测试#callback由于异常而失败.

Failures:

1) SystemDetail#callback ensure not creating duplicate records
Failure/Error: system_detail2 = create :system_detail,user_id: user.id
ActiveRecord::RecordNotSaved:
ActiveRecord::RecordNotSaved

有没有办法在不引发异常的情况下默默取消保存?

解决方法

我认为在这种情况下最好使用validate:prevent_if_same,因为基本上你的方法是一种验证规则.它也可以防止静默创建.如果要通知用户创建失败,可以随时添加错误

总结

以上是编程之家为你收集整理的ruby-on-rails – Rails Active Record取消(保存或创建)before_create回调,而不会引发异常全部内容,希望文章能够帮你解决ruby-on-rails – Rails Active Record取消(保存或创建)before_create回调,而不会引发异常所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!