代码之家  ›  专栏  ›  技术社区  ›  seokhoonlee

创建Rails时跳过回调

  •  4
  • seokhoonlee  · 技术社区  · 9 年前

    我想为Rspec测试创建一个活动记录模型。

    然而,这个模型有回调,即:before_create和after_create方法(如果我没有错的话,我认为这些方法被称为回调,而不是验证)。

    有没有一种方法可以在不触发回调的情况下创建对象?

    我以前尝试过的一些解决方案/不适用于我的案例:

    更新方法:

    update_column和其他更新方法将无法工作,因为我想创建一个对象,并且当对象不存在时,我无法使用更新方法。

    工厂女孩和后期建造:

    FactoryGirl.define do
      factory :withdrawal_request, class: 'WithdrawalRequest' do
        ...
        after(:build) { WithdrawalRequest.class.skip_callback(:before_create) }
      end
    end
    

    失败/错误:在(:build){撤回请求.class.skip_callback(:before_create)}之后

    无方法错误: 类的未定义方法“skip_callback”:类

    Skip callbacks on Factory Girl and Rspec

    跳过回调

    WithdrawalRequest.skip_callback(:before_create)
    
    withdrawal_request = WithdrawalRequest.create(withdrawal_params)
    
    WithdrawalRequest.set_callback(:before_create)
    

    失败/错误:撤回请求.skip_callback(:before_create)

    How to save a model without running callbacks in Rails

    我也试过了

    WithdrawalRequest.skip_callbacks = true
    

    这也不管用。

    ----------编辑-----------

    我的工厂功能被编辑为:

    after(:build) { WithdrawalRequest.skip_callback(:create, :before, :before_create) }
    

    我的before_create函数如下所示:

    class WithdrawalRequest < ActiveRecord::Base
      ...
      before_create do
        ...
      end
    end
    

    ----------编辑2-----------

    我将before_create更改为一个函数,以便可以引用它。这两者中的任何一种都是更好的做法吗?

    class WithdrawalRequest < ActiveRecord::Base
      before_create :before_create
      ...
      def before_create
        ...
      end
    end
    
    1 回复  |  直到 8 年前
        1
  •  5
  •   oreoluwa    9 年前

    根据参考答案:

    FactoryGirl.define do
      factory :withdrawal_request, class: 'WithdrawalRequest' do
        ...
        after(:build) { WithdrawalRequest.skip_callback(:create, :before, :callback_to_be_skipped) }
       #you were getting the errors here initially because you were calling the method on Class, the superclass of WithdrawalRequest
    
        #OR
        after(:build) {|withdrawal_request| withdrawal_request.class.skip_callback(:create, :before, :callback_to_be_skipped)}
    
      end
    end