Rails 3 - 文件名太长错误

Vin*_*ent 5 ruby-on-rails spree ruby-on-rails-3

我们在Rails 3 Spree平台上运行了一个在线商店.最近,客户在结账时开始报告奇怪的错误,在分析生产日志后,我发现了以下错误:

Errno :: ENAMETOOLONG(文件名太长 - /var/www/store/tmp/cache/UPS-R43362140-US-NJ-FlorhamPark07932-1025786194_1%7C1025786087_1%7C1025786089_15%7C1025786146_4%7C1025786147_3%7C1025786098_3%7C1025786099_4%7C1025786100_2%7C1025786114_1%7C1025786120_1%7C1025786121_1%7C1025786181_1%7C1025786182_1%7C1025786208_120110412-2105-1e14pq5.lock)

我不确定为什么这个文件名太长,如果这个错误特定于Rails或Spree.我对Rails缓存系统也不是很熟悉.如果我能解决这个问题,我将不胜感激.

Clu*_*ter 5

我猜你正在使用spree_active_shipping,因为它看起来像UPS运输报价的缓存ID.当有人创建包含大量订单项的订单时,就会发生这种情况.有了足够的行项目,这当然会为缓存创建一个非常大的文件名,从而给您带来错误.

一种选择是为您的Rails.cache使用memcache或redis,而不是使用文件系统缓存.另一种方法是修改在spree_active_shipping gem中的app/models/active_shipping.rb中生成cache_key的算法.

后一个选项可能是最好的,你可以简单地让生成的缓存键通过像MD5或SHA1这样的哈希运行.这样您就可以获得可预测的缓存密钥长度.

实际上这应该在spree_active_shipping中修复,但它不应该生成不可预测的长缓存键,即使你使用的是键值存储,也就是浪费的内存.