我正在使用rails异常通知程序gem运行rails3。当异常发生时,应该发送一封电子邮件,我从ParameterFilter类得到了一个异常。我在rails源代码中发现了这个问题,并且不确定最好的继续进行的方法。
此问题发生在ActionDispatch::Http::ParameterFilter中。在compiled_filter方法中,当key是一个符号时,第38行:key = key.dup出现错误,因为符号是不可复制的。以下是源代码:
def compiled_filter
...
elsif blocks.present?
key = key.dup
value = value.dup if value.duplicable?
blocks.each { |b| b.call(key, value) }
end我看到他们只在value上调用duplicable时才调用dup。如果我对源代码打补丁,使其只在key上调用dup,而key为duplicable,那么我的问题就解决了。我假设作者将该条件放在value上而不是key上是有原因的,所以我很好奇是否有人对这段代码有更好的理解。
仅当在application.rb中将块添加到过滤器参数时,才会出现此错误。因此,对于我最初的问题,可能有一种解决方法,它不需要在这里使用块。如果你感兴趣,请看我同事的问题Rails: Filter sensitive data in JSON parameter from logs
这个问题的关键是:action。这来自rails,我不知道是否有任何方法可以强制它成为字符串。
我提交了一个rails bug https://rails.lighthouseapp.com/projects/8994/tickets/6557-symbol-duplication-error-in-parameterfilter-compiled_filter,我已经准备好了一个补丁,它将if key.duplicable?添加到key.dup行中,我正在寻找关于这是否是正确的解决方案的意见。
发布于 2011-03-20 03:19:04
这看起来像是Rails中的一个bug。密钥应该是字符串而不是符号,或者dup应该受duplicable?保护。
您应该在https://rails.lighthouseapp.com/上提交一个错误,如果可能的话,包括一个最小的测试用例。
https://stackoverflow.com/questions/5265431
复制相似问题