読者です 読者をやめる 読者になる 読者になる

ActiveSupportが無いと俺はプログラミングも出来ないのかよ !

ウチらのあるある│あるあるを投稿して、みんなで共感しよう!

たまにRailsじゃなくてrubyを使うと、blank?とかが使えなくて悲しい思いをしますよね? blank?をRails以外でも使うときはいつもお世話になってる@sasata299さんのブログにあるのでそのとおりにすればいいです。
Rails以外の環境でblank?メソッドを使うときの注意 - (゚∀゚)o彡 sasata299's blog

ActiveSupportのblank?はよく使うメソッドの筆頭ですが、それ以外にも気づかないうちにお世話になっているものがいくつもあるので、最近使ったものを忘れないようにまとめておこうと思います。

Time.parse

(追記) ActiveSupportじゃなかった
適当な日時を表す文字列を引数に与えると、Timeオブジェクトに変換してくれるという便利なものです。
時間のフォーマットを指定したりすることなく、うまいことやってくれるのでとても楽です。

# mysqlのdatetime型
> Time.parse "2010-03-04 18:50:13"
 => 2010-03-04 18:50:13 +0900 

# solrの時間型
> Time.parse "2010-03-05T03:58:10Z"
 => 2010-03-05 03:58:10 UTC 

# twitterのAPIのレスポンス
> Time.parse "Fri Jul 16 16:55:52 +0000 2010"
 => 2010-07-17 01:55:52 +0900

プログラムで使いそうな時間の文字列はだいたいTimeオブジェクトに変換してくれました。

Time::DATE_FORMATS

先ほどのTime.parseの逆で、こっちはTimeオブジェクトを文字列に変換するやつです
まずTime::DATE_FORMATSに変換したいフォーマットを定義します

Time::DATE_FORMATS[:mysql] = "%Y-%m-%d %H:%M:%S"
Time::DATE_FORMATS[:solr] = "%Y-%m-%dT%H:%M:%SZ"
Time::DATE_FORMATS[:twitter] = "%a %b %d %H:%M:%S %z %Y"

このように定義したあとに、Timeオブジェクトのto_sメソッドで変換します

> Time.now.to_s(:mysql)
 => "2011-08-25 11:51:48" 
> Time.now.to_s(:solr)
 => "2011-08-25T11:52:05Z"
> Time.now.to_s(:twitter)
 => "Thu Aug 25 11:52:09 +0900 2011" 

ね?簡単でしょ

ActiveSupport::Concern

rubyにはmix-inというのがあります。あるクラスのメソッドを使いたいけど、継承するのはなんか意味が違うよなーって時とか、多重継承したいみたいな時に使うやつです。

module Hoge
  def moge
    puts "mogemoge"
  end
end

class Piyo
  include Hoge
end

piyo = Piyo.new
piyo.moge
# => mogemoge

上記の例のようにmoduleをclassの中でincludeしてやれば、moduleのmoreというメソッドがPiyoというクラスのインスタンスメソッドになることがわかります。
こういうことができると、includeでインスタンスメソッドだけじゃなくクラスメソッドも追加できるようにしたくなるんですが意外とめんどくさいです。(やり方は説明しません)
moduleをincludeしてインスタンスメソッドもクラスメソッドも追加したい場合は、ActiveSupport::Concernを使うと簡単にできますよというお話です。簡単さはコードを見れば一目瞭然です。

module Hoge
  extend ActiveSupport::Concern
  
  module InstanceMethods
    def instance_moge
      puts "いんすたんすめそっだよー"
    end
  end

  module ClassMethods
    def class_moge
      puts "くらすめそっだよー"
    end
  end
end

class Piyo
  include Hoge
end

Piyo.class_moge
# => くらすめそっだよー
piyo = Piyo.new
piyo.instance_moge
# => いんすたんすめそっだよー

moduleの中でActiveSupport::Concernをextendし、インスタンスメソッドを追加したい場合はInstanceMethodsを定義してその中に、クラスメソッドを追加したい場合はClassMethodsを定義してその中に書きます。簡単だし読みやすいので素敵です。
InstanceMethodsは特に明記しなくてもインスタンスメソッドになるのでなくていいかもしれません。僕は書いてません。

まとめ

今回紹介した以外にもActiveSupportには他にもいろんな便利メソッドがありますが、紹介してるとキリがないのでこのあたりでやめておきます。詳しく知りたい人は公式のドキュメントを読むとか、Rails3レシピブック190の技にあるので読んでみるといいと思います。

Rails3レシピブック 190の技

Rails3レシピブック 190の技

ActiveSupport以外にも便利なものがたくさん載ってるRails3レシピブックは超おすすめです!