【发布时间】:2018-11-22 14:45:39
【问题描述】:
重新编辑问题(感谢 Gavin Miller)
如果一个有三种核心扩展(或猴子补丁),像这些例子:
1- 表单构建器
class FormWithBuilder < ActionView::Helpers::FormBuilder
def object
# ... my code
end
end
2-类核心扩展
class Hash
def translate_values
th=Hash.new
self.each{|k,v| th[k]=I18n.translate(v)}
th
end
end
3- 表单助手
module ActionView
module Helpers
module TranslationHelper
alias_method :original_localize, :localize
def localize(*args)
....
end
end
end
end
我必须把这些文件放在哪里?
在 Gavin Miller 回应后,我明白我必须使用正确的文件夹结构,作为 Rails 核心扩展等等。而不是在config/initializers 下使用它们,那是我以前(和工作)的地方。好的,让我们创建文件夹并将它们放在 lib/...
并深深期待我已经意识到使用 config.eager_load_paths 和 config.autoload_paths 是一种不好的做法:
https://github.com/rails/rails/issues/13142
并建议将 Gavin Miller 对我说的所有 lib/core_extensions 文件夹放在 app/lib/ 文件夹下,仅此而已,但此解决方案对我不起作用,除非我 require 所有文件,但这就是,据我了解,这不是必需的,因为 app 中的所有内容都是自动加载的。
我想我缺少一些配置
这是在图像中,更容易解释
rails c
Running via Spring preloader in process 9724
Loading development environment (Rails 5.1.5)
2.4.0 :001 > Hash.new.translate_values
NoMethodError: undefined method `translate_values' for {}:Hash
在需要它之后:
2.4.0 :015 > require Rails.root.join('app','lib','core_extensions','hash','localization.rb')
=> true
2.4.0 :016 > Hash.new.translate_values
=> {}
谢谢
---- 27/10 编辑
this 是一个糟糕的解决方案吗?只需在config/initilizers/core_extensions.rb 和
Dir.glob(Rails.root.join('lib/core_extensions/**/*.rb')).sort.each do |filename|
require filename
end
这样我就不需要修改 config.autoload_paths 和 eager_load_paths
【问题讨论】:
-
你在得到答案一周后是否完全重写了问题?
-
是的,我无法很好地解释自己,这不是一个可以理解的问题
-
恢复编辑并提出新的改进问题
-
好的,我会去做的
标签: ruby-on-rails