我正在尝试将Rails从4.0.0升级到4.0.2,但是4.0.1中引入的更改破坏了我的应用程序。
这是我看到的错误:
undefined method `[]' for nil:NilClass
activerecord (4.0.2) lib/active_record/attribute_methods/read.rb:86:in `block in read_attribute'
activerecord (4.0.2) lib/active_record/attribute_methods/read.rb:84:in `fetch'
activerecord (4.0.2) lib/active_record/attribute_methods/read.rb:84:in `read_attribute'
activerecord (4.0.2) lib/active_record/attribute_methods/read.rb:59:in `__temp__6696273747f5e616d656'
app/models/player.rb:20:in `short_name'
这是堆栈跟踪开始的应用程序代码:
# app/models/player.rb
def short_name
self.class.where(first_name: first_name).where('id != ?', id).exists? ? name : first_name
end
这是看似问题的差异(和the commit on Rails):
diff -r activerecord-4.0.0/lib/active_record/attribute_methods/read.rb activerecord-4.0.1/lib/active_record/attribute_methods/read.rb
[snip]
80,86c85,92
< column = @columns_hash.fetch(name) {
< return @attributes.fetch(name) {
< if name == 'id' && self.class.primary_key != name
< read_attribute(self.class.primary_key)
< end
< }
< }
---
> column = @column_types_override[name] if @column_types_override
> column ||= @column_types[name]
>
> return @attributes.fetch(name) {
> if name == 'id' && self.class.primary_key != name
> read_attribute(self.class.primary_key)
> end
> } unless column
根据堆栈跟踪,@column_types
为零,我无法弄清楚原因。
我在控制台上没有这个问题,只有当我在服务器上运行时,可以通过rails s
(开发环境)进行精简,也可以通过foreman start
(生产环境)运行。当我部署到Heroku上的暂存时,它也会失败。我也有测试覆盖这个方法,他们通过了。
有谁知道应该设置@column_types
的位置以及为什么在这种情况下它为零?
答案 0 :(得分:6)
我也是这样做了 - 你需要将protected_attributes
gem更新为版本1.0.5。
这里有更多信息:https://github.com/rails/rails/issues/13246
从OP编辑:您可能只需要刷新缓存,该线程中提到了这一点:
Rails.cache.clear