如何使用 Active Support 核心扩展

Posted

技术标签:

【中文标题】如何使用 Active Support 核心扩展【英文标题】:How to use Active Support core extensions 【发布时间】:2011-05-13 10:30:30 【问题描述】:

我安装了 Active Support 3.0.3 和带有 Ruby 1.8.7 的 Rails 3.0.3。

当我尝试使用1.week.ago 时,我得到了

NoMethodError: undefined method 'week' for 1:Fixnum
from (irb):2

其他核心扩展似乎可以工作。我在朋友的电脑上试了一下(他的安装规格和旧版本相同),结果相同。

什么给了?

所有这些都在 IRB 中。

【问题讨论】:

你没有说你的代码是在 Rails 应用程序中运行,还是在你想在其中使用某些 Rails 扩展的 Ruby 应用程序中运行。 Use Rails 3's ActiveSupport core extensions outside rails 的副本。 【参考方案1】:

由于使用 Rails 应该自动处理这个问题,我假设您正在尝试将 Active Support 添加到非 Rails 脚本中。

阅读“How to Load Core Extensions”。

Active Support 的方法在 Rails 3 中被分成更小的组,所以我们最终不会用简单的require 'activesupport' 加载很多不需要的东西。现在我们必须做类似的事情

require 'active_support/core_ext/object/blank'

如果您不关心粒度,您可以选择加载更大的块。如果您想一口气将所有内容都使用...

对于 1.9.2:

rvm 1.9.2
irb -f
irb(main):001:0> require 'active_support/all'
=> true
irb(main):002:0> 1.week.ago
=> 2010-11-14 17:56:16 -0700
irb(main):003:0> 

对于 1.8.7:

rvm 1.8.7
irb -f
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'active_support/all'
=> true
irb(main):003:0> 1.week.ago
=> Sun Nov 14 17:54:19 -0700 2010
irb(main):004:0> 

【讨论】:

我必须首先需要 ruby​​gems 和 active_record,但之后此修复在 irb 中有效。 我所做的只是示例中的内容。我将添加我在 1.8.7 中运行它所做的工作。 如果你一直需要这个 - 假设你正在玩一些代码或其他东西,你可以添加或修改 .irbrc 文件以要求你一直使用的所有库。它将在启动时自动加载它们。 IE。我一直在使用 awesome_print、hirb 和一些自定义方法——所以我只是把它们放在那里,而不必为 1.hour.ago 或 ap :a => 3, :b => "nick " 工作。 查看irbtools。它包括对 IRB 的各种不错的调整。而且,如果您需要暂时禁用它们,请致电irb -f,它不会加载它们。 我要补充一点,对于 Ruby 交互式会话,新的热点是 Pry。非常令人印象深刻。【参考方案2】:

您可以通过已经提到的精细添加库

require 'active_support/core_ext/some_class/some_file'

您还可以在另一个级别上进行

require 'active_support/core_ext/some_class'

但是,目前TimeDateDateTime 无法使用此功能。

解决此问题的方法是require 'active_support/time',它将为您提供TimeDateDateTime,这将解决 OP 的要求而无需一切。


My Rails patch,添加了active_support/core_ext/datedate_time,使其成为Rails v4.0.0,因此现在您可以单独要求它们。耶!

【讨论】:

【参考方案3】:

在我的情况下,以下链接有效:

https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html

$ cat Gemfile.lock | grep -A 1 "BUNDLED WITH"
BUNDLED WITH
   1.17.3

$ gem install bundler -v '1.17.3'

【讨论】:

【参考方案4】:

这可以从控制台工作吗?这对我有用:

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.6.5
BuildVersion:   10H574

$ rails c
Loading development environment (Rails 3.0.3)
>> 1.week.ago
=> Sun, 14 Nov 2010 16:57:18 UTC +00:00

【讨论】:

【参考方案5】:

你可以: 需要“active_support/core_ext” 或: 需要 'active_support/all'

【讨论】:

以上是关于如何使用 Active Support 核心扩展的主要内容,如果未能解决你的问题,请参考以下文章

为啥都是autoload,load_all!并要求所有在active_support.rb 中使用?

试图在 gem 中要求 active_support

需要 active_support/time_with_zone 后的 Time:Class 的未定义方法`zone`

Ruby 无法加载此类文件 - active_support/core_ext/object/blank

Ruby无法加载此类文件 - active_support / core_ext / object / blank

报错解决DateTimeField *** received a naive datetime (***) while time zone support is active