Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails活动记录在创建回调之前取消(保存或创建),而不引发异常_Ruby On Rails_Ruby_Activerecord_Rspec_Callback - Fatal编程技术网

Ruby on rails Rails活动记录在创建回调之前取消(保存或创建),而不引发异常

Ruby on rails Rails活动记录在创建回调之前取消(保存或创建),而不引发异常,ruby-on-rails,ruby,activerecord,rspec,callback,Ruby On Rails,Ruby,Activerecord,Rspec,Callback,实际上,我想测试一个模型回调 system\u details.rb(型号) 由于异常,第二次测试#回调失败 失败: 1) SystemDetail#回调确保不创建重复记录 失败/错误:system\u detail2=创建:system\u detail,:类似的\u代理,用户\u id:user.id ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved 有没有办法在不引发异常的情况下悄悄取消保存?我认为在这种情况下最好使用va

实际上,我想测试一个模型回调

system\u details.rb(型号)

由于异常,第二次测试
#回调
失败

失败:

1) SystemDetail#回调确保不创建重复记录 失败/错误:system\u detail2=创建:system\u detail,:类似的\u代理,用户\u id:user.id ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved


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

我认为在这种情况下最好使用
validate:prevent\u if\u same
,因为基本上您的方法是一种验证规则。它也会阻止创造。如果您想通知用户创建失败,您可以随时添加错误

Hi@dziamber,谢谢您的回答。这里我不想通知用户创建失败,如果连续的上一条记录相同,我只想更新上一条记录。因此,我认为使用
验证:如果相同,则阻止
将为您提供帮助。如果
验证:如果相同,则阻止
我必须强制添加一个错误以取消
保存/创建
,否则记录将被保存。添加错误将引发带有已定义错误消息的异常,我不希望这样。我只想毫无例外地优雅地跳过保存。当您调用
save时,它会引发错误但在调用
save
时不会,我正在调用create not save,请参阅测试用例。
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
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, :similar_agent, 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