Ruby on rails 重写或向已加载的类添加方法

Ruby on rails 重写或向已加载的类添加方法,ruby-on-rails,ruby,activesupport,Ruby On Rails,Ruby,Activesupport,我正在尝试向ActiveSupport::TimeWithZone类添加功能,并将以下文件添加到我的rails项目中: lib/active\u support/time\u with\u zone.rb class ActiveSupport::TimeWithZone def in_time_zone_(new_zone = ::Time.zone) Time.zone.parse(in_time_zone(new_zone).strftime('%a, %d %b %Y %H:

我正在尝试向ActiveSupport::TimeWithZone类添加功能,并将以下文件添加到我的rails项目中:

lib/active\u support/time\u with\u zone.rb

class ActiveSupport::TimeWithZone
  def in_time_zone_(new_zone = ::Time.zone)
    Time.zone.parse(in_time_zone(new_zone).strftime('%a, %d %b %Y %H:%M:%S'))
  end
end
config.autoload_paths << "#{Rails.root}/lib"
而且

config/application.rb

class ActiveSupport::TimeWithZone
  def in_time_zone_(new_zone = ::Time.zone)
    Time.zone.parse(in_time_zone(new_zone).strftime('%a, %d %b %Y %H:%M:%S'))
  end
end
config.autoload_paths << "#{Rails.root}/lib"

config.autoload_路径所有猴子补丁通常存储在
config/initializers
dir中。 我将您的代码放在带有_zone.rb的
config/initializers/active_support_time_中

这是我的例子

2.1.2 :005 > r = Reason.last
  Reason Load (0.1ms)  SELECT "reasons".* FROM "reasons" ORDER BY "reasons"."id" DESC LIMIT 1
 => #<Reason id: 3, name: "R3", project_id: 3, created_at: "2016-05-04 06:43:25", updated_at: "2016-05-04 06:43:25", deleted: false>
2.1.2 :006 > r.created_at.class
 => ActiveSupport::TimeWithZone
2.1.2 :007 > r.created_at.in_time_zone_
 => Wed, 04 May 2016 06:43:25 UTC +00:00
2.1.2 :010 > Time.zone = "Novosibirsk"
 => "Novosibirsk"
2.1.2 :011 > Time.zone
 => #<ActiveSupport::TimeZone:0x007fbcd695ad90 @name="Novosibirsk", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Asia/Novosibirsk>, @current_period=nil>
2.1.2 :012 > r.created_at.in_time_zone_
 => Wed, 04 May 2016 13:43:25 NOVT +07:00
2.1.2 :013 >
我的应用程序使用了
gem'rails',4.0.3'


希望有帮助。

所有猴子补丁通常存储在
config/initializers
dir中。 我将您的代码放在带有_zone.rb的
config/initializers/active_support_time_中

这是我的例子

2.1.2 :005 > r = Reason.last
  Reason Load (0.1ms)  SELECT "reasons".* FROM "reasons" ORDER BY "reasons"."id" DESC LIMIT 1
 => #<Reason id: 3, name: "R3", project_id: 3, created_at: "2016-05-04 06:43:25", updated_at: "2016-05-04 06:43:25", deleted: false>
2.1.2 :006 > r.created_at.class
 => ActiveSupport::TimeWithZone
2.1.2 :007 > r.created_at.in_time_zone_
 => Wed, 04 May 2016 06:43:25 UTC +00:00
2.1.2 :010 > Time.zone = "Novosibirsk"
 => "Novosibirsk"
2.1.2 :011 > Time.zone
 => #<ActiveSupport::TimeZone:0x007fbcd695ad90 @name="Novosibirsk", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Asia/Novosibirsk>, @current_period=nil>
2.1.2 :012 > r.created_at.in_time_zone_
 => Wed, 04 May 2016 13:43:25 NOVT +07:00
2.1.2 :013 >
我的应用程序使用了
gem'rails',4.0.3'


希望能有所帮助。

实际上Rails比您想象的要聪明得多,您放入的
自动加载路径数组是供将来使用的。在
development
环境
中,如果将
off
置于关闭状态,则立即加载类。因此,类仅在代码需要时加载到内存中或
required

需要时,Rails通过
类和
命名空间搜索
文件

示例
如果它看到
ActiveSupport::TimeWithZone
,它希望路径是
lib/active\u support/time\u with\u zone.rb

lib
存在是因为您将
lib
目录放在数组中

初始值设定项
目录的情况并非如此。因为这个目录中的所有文件都被认为是重要的,并且在Rails启动时加载

有关更多信息,请参见此

实际上Rails比您想象的要聪明得多,您放在
自动加载路径中的路径是供将来使用的。在
development
环境
中,如果将
off
置于关闭状态,则立即加载类。因此,类仅在代码需要时加载到内存中或
required

需要时,Rails通过
类和
命名空间搜索
文件

示例
如果它看到
ActiveSupport::TimeWithZone
,它希望路径是
lib/active\u support/time\u with\u zone.rb

lib
存在是因为您将
lib
目录放在数组中

初始值设定项
目录的情况并非如此。因为这个目录中的所有文件都被认为是重要的,并且在Rails启动时加载

有关更多信息,请参见此

当您尝试使用未定义的常量时,Rails会为您加载代码:调用
常量missing
hook Rails sets,搜索
自动加载路径
中具有与该常量对应名称的文件,然后需要该文件

在您的情况下,将永远不会调用此代码:
TimeWithZone
类是在rails自身的加载过程中加载的


您可以将您的monkey补丁放在总是被加载的东西中(例如在初始化器中),也可以从初始化器显式地要求它

Rails在您尝试使用未定义的常量时为您加载代码:调用
const_missing
hook Rails sets,搜索
autoload_路径
,查找名称与该常量对应的文件,然后需要该文件

在您的情况下,将永远不会调用此代码:
TimeWithZone
类是在rails自身的加载过程中加载的


您可以将您的monkey补丁放在总是被加载的东西中(例如在初始化器中),也可以从初始化器显式地要求它

为什么你认为它被忽略了?我用行为更新了问题为什么你认为它被忽略了?我用行为更新了问题谢谢你,你是对的,但是弗雷德里克更好地解释了整个比率谢谢你,你是对的,但是弗雷德里克更好地解释了整个比率谢谢,你是对的,但是弗雷德里克更好地解释了整个比率谢谢,你是对的,但是弗雷德里克更好地解释了整个比率