在从模型表中删除列后尝试重新启动PaperTrail版本时遇到问题。
堆栈跟踪开始:private method 'warn' called for nil:NilClass
并指出reify
方法中的以下几行:
# Set all the attributes in this version on the model.
attrs.each do |k, v|
if model.has_attribute?(k)
model[k.to_sym] = v
elsif model.respond_to?("#{k}=")
model.send("#{k}=", v)
else
logger.warn "Attribute #{k} does not exist on #{item_type} (Version id: #{id})."
end
end
因为我已从表中删除了列,所以我正在逻辑树的else
块中登陆,这看起来非常合理......我很好地记录了这一点,继续进行具体化。
但是,我不明白为什么logger
首先是nil
。我在哪里以及如何设置PaperTrail记录器,以便我们只记录行为而不是崩溃应用程序?
答案 0 :(得分:1)
截至2016-12-14,答案是升级到PT 6.0.2。
这已在PT 6.0.2中修复,感谢Andy的PR https://github.com/airblade/paper_trail/pull/905(OP。谢谢,Andy)
答案 1 :(得分:0)
我想出了两种方法来实现这一目标。
1)通过覆盖PaperTrail::Version
类
module PaperTrail
class Version < ActiveRecord::Base
include PaperTrail::VersionConcern
def logger
Logger.new(STDOUT)
end
end
end
2)通过在初始化程序中设置ActiveRecord :: Base的记录器(显然这会影响所有模型,因此您可能希望将日志级别指定为高于调试的值):
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Base.logger.level = Logger::INFO
如果有另一种推荐的方式,我很好奇,但这些方法目前似乎适用于我的目的。