切换! Rails中的Bang Change 4

时间:2016-03-02 18:57:55

标签: ruby-on-rails-4 toggle persistence rails-activerecord

试图为文档目的解决一个谜。 我们正在从Rails 3.2升级到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>'

我们将其更改为适用于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中以不同的方式运行。或者,是否更新了&#34;属性&# 34;并且保存可能会有不同的运作方式?

非常感谢!

1 个答案:

答案 0 :(得分:0)

看起来act_as_audited正在进行该行为,并且不是bitfield / toggle精明,这将是我的猜测。太多厨师在这里乱砍他们的商品。 (bitfield和acts_as_audited)。