首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Rails/Zeitwerk希望`burgerfrenchfry_coupon.rb`定义常量‘`BurgerFrenchfryCoupon`’?

为什么Rails/Zeitwerk希望`burgerfrenchfry_coupon.rb`定义常量‘`BurgerFrenchfryCoupon`’?
EN

Stack Overflow用户
提问于 2022-07-19 20:52:24
回答 2查看 134关注 0票数 1

我正在将一个大型遗留Rails应用程序从5.2升级到6.0。在修复自动路径的过程中,我遇到了一个问题,Rails/Zeitwerk似乎违反了他们自己关于常量名称与文件名的关系的规则。我不能分享来自这个应用程序的实际代码,但实际上情况如下:

config/application.rb

config.autoload_paths << "#{config.root}/app/models/coupons"

app/models/coupons/burgerfrenchfry_coupon.rb

代码语言:javascript
复制
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?

  • Where,或者如何对常量名称的期望进行覆盖?如何配置Rails来识别这个常量应该在这个文件中定义,而无需将应用程序中对它的所有引用都更改为BurgerFrenchfryCoupon

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-20 14:56:12

问题是,由于某种原因,自动加载器的inflector被配置为将"burgerfrenchfry_coupon“伪装为"BurgerFrenchfryCoupon”。如果使用主动支持拐点(默认),就会有一些自定义的拐弯规则影响到这一点。

您可以在不影响应用程序其余部分的情况下,通过这种方式来修复这个特定的应用程序:

代码语言:javascript
复制
# config/initializers/autoloading.rb

inflector = Rails.autoloaders.main.inflector
inflector.inflect("burgerfrenchfry_coupon" => "BurgerfrenchfryCoupon")

这在自动加载器的inflector中设置了一个特殊的映射,它忽略了所有其他内容。

票数 2
EN

Stack Overflow用户

发布于 2022-07-20 18:45:49

这里的答案最终是一个定制的拐点,它被添加到了activesupport。

代码语言:javascript
复制
ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym 'BurgerFrenchfry'
end

由于这个拐点对于应用程序的其他部分是必要的,为了修复Zeitwerk错误,我添加了文件config/initializers/zeitwerk.rb,内容如下:

代码语言:javascript
复制
Rails.autoloaders.each do |autoloader|
  autoloader.inflector.inflect(
    "burgerfrenchfry_coupon" => "BurgerfrenchfryCoupon"
  )
end

,它覆盖此文件的拐点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73043363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档