Rails2.2的ActiveSupport新添加了几个方法,非常有意思。 

一  。STRINGINQUIRER
来看个例子, 有时候,我们有这样的需求,看一个用户是否是激活状态,数据是从数据库里查出来的:

class Client
  def status
    self.status
  end
end
c = Client.new
c.status
# => "active"
c.status == "active"
# => true
c.status == "inactive"
# => false

但是现在我们有了更好的方法:
class Client
  def status
    ActiveSupport::StringInquirer.new(“#{self.status}”)
  end
end
c = Client.new
c.status
# => "active"
c.status.active?
# => true
c.status.inactive?
# => false
c.status.xxx?
# => false

二。 many?

Enumerable 模块里添加了一个 many? 方法。它和它的名字一样,它可以告诉你 collection 是否包括超过一
个对象。
这个方法是 collection.size > 1 的别名(alias)。 看一下一些例子:
>> [].many?
# => false
>> [ 1 ].many?
# => false
>> [ 1, 2 ].many?
# => true
除例子里的格式外,这个方法还可以接受一个block。
看一下这些例子:
>> x = %w{ a b c b c }
# => ["a", "b", "c", "b", "c"]
>> x.many?
# => true
>> x.many? { |y| y == 'a' }
# => false
>> x.many? { |y| y == 'b' }
# => true
# another example...
people.many? { |p| p.age > 26 }
只有 block 里面的元素超一个时才会返回 true, 如果没有 block的话,当collection包含超过一个对象时才返
回true.

我自己实现了一个how_many(item)方法,来计算一个数组里有几个item :
def how_many(item)
   return select{|y| y == item}.size
end

非常简单,但是比较实用。

三。  each_with_object 这个方法是从ruby1.9里拿到rails的。 和inject相当类似,但是有很大的不同,来看看例子:
>> ss = %w(first second third)
=> ["first", "second", "third"]
>> ss.inject({}) do |hash, str|
?>   puts hash
>> end

nil
nil
=> nil


>> ss.each_with_object({}) do |str, hash|
?>   puts hash
>> end



=> {}

看出来了吗?
参数hash的位置换了。
  在每个循环内,除了获取集合内的一个对象,也获得一个叫memo对象。

%w(first second third).each_with_object({}) do |str, hash|
hash[str.to_sym] = str
end
# => {:second=>"second", :first=>"first", :third=>"third"}
注意到上面的例子中,memo是一个空的hash{}。在block里面,我用集合里的内容填充这个hash.  你换成inject例子试试 ?


四。(无耻的转帖一段) parameterize方法使任何文本的URL更友好。看一下这个例子:
Model:
  class User
      def to_param
          "#{id}-#{name.parameterize}"
      end
   end

Controller:
    @user = User.find(1)
    # => #

View:
   link_to @user.name, user_path
    # => Carlos E. Brando
一个有趣的事情就是这个特性还不能用在口语化的字符,对世界各地的人来说可能是一个很严重的问
题。可以使用slugalizer插件来解决这个问题。?
对所有没有使用 Rails 2.2 的人,可以使用 slugalizer 插件。

五。  Module#delegate现在有一个新的 :prefix 选项, 这个蛮不错的。 以前使用这个delegate方法,经常会因为某些遗留数据库的字段大写出错,或者有的表字段命名相同导致代码里可读性比较差,现在加了前缀,可以区分是代理那个表的字段。 代码里一目了然。看例子(例子转):
class Invoice < ActiveRecord::Base
delegate :street, :city, :name, :to => :client, :prefix => true
end
Invoice.new.client_street
Invoice.new.client_city
Invoice.new.client_name
你也可以使用一个自定义的前缀:
class Invoice < ActiveRecord::Base
delegate :street, :city, :name, :to => :client, :prefix => :customer
end
Invoice.new.customer_street
Invoice.new.customer_city
Invoice.new.customer_name