gpt4 book ai didi

ruby-on-rails - 带有Zeitwerk的Rails 6 : How to Extend Ruby Core Classes like Date,时间,字符串等

转载 作者:行者123 更新时间:2023-12-03 16:12:40 24 4
gpt4 key购买 nike

我正在将Rails 5.2.2升级到现在具有Zeitwerk的Rails 6.0.0。

以前,我已经扩展了ruby核心类,如this question中所述的Date,Time,String,Float等。使用初始化程序文件从lib/core_ext/*文件夹中加载所有文件。现在,当启动rails server时,它会出错,并且stacktrace的最后一行将读取:

/home/username/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/zeitwerk-2.1.10/lib/zeitwerk/loader.rb:351:in `const_get': uninitialized constant CoreExt::Date (NameError)

不幸的是,Zeitwerk在 lib/core_ext/date.rb等引发已定义错误的地方引发错误(在 Rails.autoloaders.log!中使用 application.rb时。 CoreExt::Date
从那以后,我将文件直接移到 initializers(以前我只有一个初始化器目录,其中有一个文件从 'lib/core_ext/*文件夹中加载了每个文件)。目前,此问题已得到解决,但我想将 core_ext文件夹和文件保留在原处。

我在这里错过了什么?
lib/core_ext/date.rb
class Date
def to_sap
strftime('%d.%m.%Y')
end
end

我曾尝试在 CoreExt中显式包装,但这无济于事。
module CoreExt
class Date
def to_sap
strftime('%d.%m.%Y')
end
end
end

最佳答案

就像在https://github.com/fxn/zeitwerk#file-structure上说的

loader.push_dir(Rails.root.join("app/models"))
loader.push_dir(Rails.root.join("app/controllers"))
Zeitwerk的作者: https://github.com/rails/rails/issues/37835#issuecomment-560563560

The lib folder does not belong to the autoload paths since Rails 3. @pixeltrix's is the recommended modern idiom if you want to autoload.Otherwise, lib belongs to $LOAD_PATH and you can require files in that directory.


我们可以调用push_dir来加载lib子目录。我的解决方案:
# config/initializers/zeitwerk.rb

Rails.autoloaders.main.push_dir(Rails.root.join('lib'))
或者
# config/application.rb

...
config.autoload_paths += [
Rails.root.join('lib')
]
然后可以自动加载 CoreExt::Date

关于ruby-on-rails - 带有Zeitwerk的Rails 6 : How to Extend Ruby Core Classes like Date,时间,字符串等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58061771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com