第3章: ActiveSupport
By Dong Bin, 2008/06/17
摘要:
Active Support 是一个非常有用的类集合,以及对 Ruby on Rails 应用非常有用的核心库扩展集合。
ACTIVESUPPORT::COREEXTENSIONS::DATE::CALCULATIONS
Time#end_of_day
返回当前日期和时间 11:59:59 PM.
Time#end_of_week
返回周末时间 (Sunday 11:59:59 PM).
Time#end_of_quarter
返回一个 Date 对象,代表本季度最后一天。换句话说,它根据当前日期返回三月,六月,九月或者十二月的最后一天。
Time#end_of_year
返回十二月 31 日 11:59:59 PM
Time#in_time_zone
本方法类似于 Time#localtime, 除了它使用 Time.zone 而不是 底层操作系统的时区。你可以传入 TimeZone 或者 String 作为参数。看下面的例子:
Time.zone = 'Hawaii'
Time.utc(2000).in_time_zone
# => Fri, 31 Dec 1999 14:00:00 HST -10:00
Time.utc(2000).in_time_zone('Alaska')
# => Fri, 31 Dec 1999 15:00:00 AKST -09:00
Time#days_in_month
方法 days_in_month 中的一个 bug 被修正了, 当没有指定年的时候,对于2月它返回错误的天数。
这个改变使得在没有指定年的情况下,当前年在方法调用的作为默认值。假设你处于闰年,看下面的例子:
Loading development environment (Rails 2.0.2)
>> Time.days_in_month(2)
=> 28
Loading development environment (Rails 2.1.0)
>> Time.days_in_month(2)
=> 29
DateTime#to_f
DateTime 类得到了一个新的方法名为 called to_f,它把日期以浮点数的形式返回。这个浮点数代表从 Unix 纪元(1970,1月1日 午夜)开始的秒数。
Date.current
Date 类得到了一个新方法名为 current 来代替 Date.today, 因为它考虑到 config.time_zone 中设置的时区,如果它设置了, 返回 Time.zone.today. 如果没有设置, 它返回 Date.today.
FRAGMENT_EXIST?
两个新方法被加入到 cache_store 中: fragment_exist? 和 exist?.
方法 fragment_exist? 顾名思义, 它检验一个 key 所指定的缓存片段是否存在。基本上代替了著名的:
read_fragment(path).nil?
exist? 方法被加入到 cache_store, 而 fragment_exist? 是一个你能够在 Controller 中使用的 helper。
UTC OR GMT?
这是一个修正,但是很有趣。迄今为止,Rails 使用 UTC 缩写很频繁,但是当 TimeZone 的 to_s 方法被调用的时候,它打印 GMT,而不是 UTC。这是因为 GMT 缩写 在对于最终用户最熟悉。 如果你观察 Windows 控制面板,其中你可以选择时区,你会注意到缩写是 GMT。Google 和 Yahoo 也在他们的产品中使用 GMT。
TimeZone['Moscow'].to_s #=> "(GMT+03:00) Moscow"
JSON ESCAPE
json_escape 方法行为类似 html_escape。在我们想要在HTML页面中显示 JSON 字符串的时候非常有用。例如,在一个文档处理中:
puts json_escape("is a > 0 & a < 10?")
# => is a \u003E 0 \u0026 a \u003C 10?
我们也能使用简写 j 在 ERB 中:
<%= j @person.to_json %>
如果你想所有的 JSON 代码默认都被 'escaped', 在你的 environment.rb 文件中包含下面的代码:
ActiveSupport.escape_html_entities_in_json = true
MEM_CACHE_STORE NOW ACCEPTS OPTIONS
Memcache-Client 被包含在 ActiveSupport::Cache 中使得事情变得比以前更容易了, 但是它也剥夺了灵活性,它除了 memcached 服务器的 IP 之外什么都不允许我们配置。Jonathan Weiss 提交给Rails一个补丁,允许额外的选项比如:
ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost"
ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost", '192.168.1.1',
:namespace => 'foo'
或者
config.action_controller.fragment_cache_store = :mem_cache_store, 'localhost',
{:compression => true, :debug => true, :namespace =>'foo'}
TIME.CURRENT
Time 类中的新方法.
current 方法返回值依赖 config.time_zone, 如果之前指定过,方法返回 Time.zone.now,否则返回 Time.now.
# return value depends on config.time_zone
Time.current
since 和
ago 方法也改变了他们的返回值, 如果 config.time_zone 已经指定,它返回一个 TimeWithZone.
它让 Time.current 方法 作为新的默认方法来获取当前时间。代替了 Time.now (这个方法仍然存在,但是它不考虑指定的时区).
datetime_select 方法,
select_datetime 和
select_time 也已被更新以默认返回 Time.current.
REMOVING WHITESPACES WITH SQUISH METHOD
两个新方法被加入到 String 对象中,squish 和 squish!.
这两个方法和
strip 方法一样。它删除文本前后的空格,它也删除文本中间无用的空格。看这个例子 :
“ A text full of spaces “.strip
#=> “A text full of spaces”
“ A text full of spaces ".squish
#=> “A text full of spaces”