Ruby on rails 3 Rails 3序列化属性验证错误:nil:NilClass的未定义方法“read\u attribute\u for\u validation”
当尝试将序列化属性与已定义的类一起使用时,Rails会很高兴,直到保存对象之后。我的ActiveRecord模型和使用ActiveModel::validations的序列化对象中都有验证。作为验证的一部分,父模型检查以确保序列化对象有效?。我相信这是问题的核心,但我不确定它为什么会导致问题,也不确定解决问题的最佳方法 我已将问题简化为一个最小的rails项目: 密码 创建新的rails项目版本3.2.6并使用rails g model a数据创建a模型:文本I定义: app/models/a.rb 测试/单元/a_测试.rb 所以@errors中的@base是nil,这就是nil:NilClass`的异常未定义的methodread\u属性\u中引用的nil 有人知道发生了什么吗?这是Rails bug吗?我做错什么了吗Ruby on rails 3 Rails 3序列化属性验证错误:nil:NilClass的未定义方法“read\u attribute\u for\u validation”,ruby-on-rails-3,validation,serialization,ruby-on-rails-3.2,Ruby On Rails 3,Validation,Serialization,Ruby On Rails 3.2,当尝试将序列化属性与已定义的类一起使用时,Rails会很高兴,直到保存对象之后。我的ActiveRecord模型和使用ActiveModel::validations的序列化对象中都有验证。作为验证的一部分,父模型检查以确保序列化对象有效?。我相信这是问题的核心,但我不确定它为什么会导致问题,也不确定解决问题的最佳方法 我已将问题简化为一个最小的rails项目: 密码 创建新的rails项目版本3.2.6并使用rails g model a数据创建a模型:文本I定义: app/models/a.
谢谢 升级到ruby 1.9.3-p194修复了这个问题,我以前使用的是1.9.2-p290。相关github问题:
class A < ActiveRecord::Base
attr_accessible :data
serialize :data, B
validate :custom
def custom
errors.add :data, "whoopsies!" unless data.valid?
end
end
class B
include ActiveModel::Validations
attr_accessor :foo
validates_presence_of :foo
end
require 'test_helper'
class ATest < ActiveSupport::TestCase
test "weird failure" do
a = A.new
b = B.new
b.foo = 'bar'
a.data = b
assert a.valid?
assert b.valid?
assert a.save
assert a.valid? # -> throws exception
end
end
NoMethodError: undefined method `read_attribute_for_validation' for nil:NilClass
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/errors.rb:254:in `block in add_on_blank'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/errors.rb:253:in `each'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/errors.rb:253:in `add_on_blank'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations/presence.rb:8:in `validate'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:310:in `_callback_before_7'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:407:in `_run__2107971919899649095__validate__2662006763039653414__callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in `__run_callback'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:385:in `_run_validate_callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:81:in `run_callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations.rb:226:in `run_validations!'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations.rb:193:in `valid?'
/Users/gbelote/tmp/serialize-fail/app/models/a.rb:8:in `custom'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:407:in `_run__3204678033069886840__validate__2662006763039653414__callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in `__run_callback'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:385:in `_run_validate_callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:81:in `run_callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations.rb:226:in `run_validations!'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations/callbacks.rb:53:in `block in run_validations!'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:403:in `_run__3204678033069886840__validation__2662006763039653414__callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in `__run_callback'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:385:in `_run_validation_callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:81:in `run_callbacks'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations/callbacks.rb:53:in `run_validations!'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activemodel-3.2.6/lib/active_model/validations.rb:193:in `valid?'
/Users/gbelote/.rvm/gems/ruby-1.9.2-p290@serialize-fail/gems/activerecord-3.2.6/lib/active_record/validations.rb:69:in `valid?'
/Users/gbelote/tmp/serialize-fail/test/unit/a_test.rb:14:in `block in <class:ATest>'
before: #<B:0x0000010327e710 @foo="bar", @validation_context=nil, @errors=#<ActiveModel::Errors:0x0000010321b7a0 @base=#<B:0x0000010327e710 ...>, @messages={}>>
after: #<B:0x00000103197158 @foo="bar", @validation_context=nil, @errors=#<ActiveModel::Errors:0x000001031965f0 @base=nil, @messages={}>>