2016-03-02 22 views
1

試圖解決文檔目的的謎團。 我們從Rails的3.2升級到Rails 4切換! Bang Change in Rails 4

在Rails的3.2代碼中,我們(當然,有):

def update_object_special_eligibility 
    object.toggle!(:can_run_on_special) if object && object.can_run_on_special? && ineligible_for_special? 
end 

我知道這不會給你所有你需要的信息,但這是錯誤。你應該知道can_run_on_special是一個位域而不是官方屬性,儘管我不認爲它實際上是相關的。只是覺得應該讓你知道爲什麼我們得到的錯誤:

1) Error: 
ObjectStatusTest#test_should_mark_object_as_not_eligible_to_run_on_special_for_specific_unschedule_reasons: 

ActiveModel::MissingAttributeError: can't write unknown attribute  `can_run_on_special' 
    config/initializers/acts_as_audited.rb:280:in `write_attribute_with_audit' 
    app/models/object_status.rb:437:in `update_deal_amazon_eligibility' 
    test/unit/object_status_test.rb:481:in `block in <class:ObjectStatusTest>' 
    test/fast_test_helper.rb:99:in `call' 
    test/fast_test_helper.rb:99:in `block in <class:TestCase>' 

我們把它改爲代碼工作on Rails的4:

def update_object_special_eligibility 
    if object && object.can_run_on_special? && ineligible_for_special? 
    object.update_attributes! :can_run_on_special => false 
end 

我懷疑是因爲toggle!運作就像update_attribute在繞過驗證,它只是返回false用於保存該屬性,因此,toggle!只是不工作了,因爲屬性的更新和保存不起作用。但我不確定是這種情況。我希望在這裏有人可能會對ActiveRecord :: Persistence方法(toggle!)在Rails 4中的運行方式有所不同有所瞭解。或者,是否更新了「屬性」和保存方式可能​​不同?

非常感謝!

回答

0

看起來像acts_as_audited正在進入的行爲,而不是位/切換智慧,將是我的猜測。這裏有太多的廚師在他們的商品中盜用。 (位域和acts_as_audited)。