我正在将一个大型遗留Rails应用程序从5.2升级到6.0。在修复自动路径的过程中,我遇到了一个问题,Rails/Zeitwerk似乎违反了他们自己关于常量名称与文件名的关系的规则。我不能分享来自这个应用程序的实际代码,但实际上情况如下:
在config/application.rb中
config.autoload_paths << "#{config.root}/app/models/coupons"
在app/models/coupons/burgerfrenchfry_coupon.rb中
class BurgerfrenchfryCoupon << ApplicationRecord
end当应用程序中的另一个类引用BurgerfrenchfryCoupon类时,将以BurgerFrenchfryCoupon作为建议的类名抛出一个NameError (该类在应用程序中不存在)。当我直接在引用app/models/coupons/burgerfrenchfry_coupon的文件中需要BurgerfrenchfryCoupon路径时,我会得到一个Zeitwerk错误:Zeitwerk::NameError: expected file /redacted/app/models/coupons/burgerfrenchfry_coupon.rb to define constant BurgerFrenchfryCoupon, but didn't
我对应用程序进行了彻底的搜索,找出了任何可以自定义期望的地方,但我什么也没想出来。有没有人对以下内容有任何想法:
为什么这是happening?
BurgerFrenchfryCoupon。
发布于 2022-07-20 14:56:12
问题是,由于某种原因,自动加载器的inflector被配置为将"burgerfrenchfry_coupon“伪装为"BurgerFrenchfryCoupon”。如果使用主动支持拐点(默认),就会有一些自定义的拐弯规则影响到这一点。
您可以在不影响应用程序其余部分的情况下,通过这种方式来修复这个特定的应用程序:
# config/initializers/autoloading.rb
inflector = Rails.autoloaders.main.inflector
inflector.inflect("burgerfrenchfry_coupon" => "BurgerfrenchfryCoupon")这在自动加载器的inflector中设置了一个特殊的映射,它忽略了所有其他内容。
发布于 2022-07-20 18:45:49
这里的答案最终是一个定制的拐点,它被添加到了activesupport。
ActiveSupport::Inflector.inflections do |inflect|
inflect.acronym 'BurgerFrenchfry'
end由于这个拐点对于应用程序的其他部分是必要的,为了修复Zeitwerk错误,我添加了文件config/initializers/zeitwerk.rb,内容如下:
Rails.autoloaders.each do |autoloader|
autoloader.inflector.inflect(
"burgerfrenchfry_coupon" => "BurgerfrenchfryCoupon"
)
end,它覆盖此文件的拐点。
https://stackoverflow.com/questions/73043363
复制相似问题