投稿者:Nihito Kawahara

Tech

いまさらですがActive Supportについて概要を説明します。

blog-details

コラビットの川原です。

Ruby on Railsは設定より規約(convention over configuration)という思想があります。

Railsの規約をしっかり知っていれば、開発者は余計な苦労せず、要領よく開発することができます。

ぜひ覚えておくとよいものとしてActiveSupportがあります。

今回はActiveSupportの概要について説明したいと思います。

ActiveSupportとは

Active SupportはRuby on Railsのコンポーネントであり、Ruby言語の拡張、ユーティリティ、その他横断的な作業を担っています。 Active Supportは言語レベルで基本部分を底上げして豊かなものにし、Railsアプリケーションの開発とRuby on Railsそれ自体の開発に役立てるべく作られています。

Rails ガイド(日本語訳)より

StringやInteger、Date、Datetimeなどのコアなクラスのメソッドを拡張してくれるのが、ActiveSupportの役割です。 Ruby自体も表現力の高い言語ですが、ActiveSupportはその表現力をより押し上げてくれます。

どのように拡張されているのか、今回一部を紹介したいと思います。

Rails consoleで試す

Rails開発者ならみんな知ってますね。下記のコマンドでコンソールを立ち上げて、実行結果を検証します。

rails console

Objectの拡張

Rubyでは全てのclassがObjectを継承しています。 そのObject classに対して拡張を行なっています。

[].blank?
=> true
 
[1, 2, 3].present?
=> true
 
{}[:hoge].presence || 'piyo'
=> "piyo"
 
class Hoge; end;
Hoge.new.try(:not_implemented_method)
=> nil
 
{a: 1, b: 2}.to_param
=> "a=1&b=2"
 
[1,2,3].to_param
=> "1/2/3"
 
{a: 1}.to_json
=> "{\"a\":1}"

他にも色々あります。 これらは全てObject.newで作成したオブジェクトに対して呼び出すことができます。

Classの拡張

RubyではクラスもClassです。RailsはClass classも拡張しています。

class Hoge
  cattr_accessor(:x) { 'default value' }
end
 
Hoge.x
=> "default value"
Hoge.new.x
=> "default value"
 
Hoge.x = 'changed value'
Hoge.x
=> "changed value"
Hoge.new.x
=> "changed value"

class内で@@var_nameみたいに定義することもできますが、上記の方が少し便利です。

Stringの拡張

Stringは特に便利です。慣れるとrails以外のプロジェクトでもActiveSupportをrequireしたくなります。 (実際そういうGemは多いです。)

"あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。".truncate(20)
=> "あのイーハトーヴォのすきとおった風..."
 
"some_text".inquiry.some_text?
=> true
 
"another_text".inquiry.some_text?
=> false
 
"member".pluralize
=> "members"
 
"members".singularize
=> "member"
 
"User".foreign_key
=> user_id
 
"2010-07-27".to_date
=> Tue, 27 Jul 2010

他にも色々なClassを拡張しています。 今回紹介したのはほんのわずかです。

Rails初心者の方は特にこういったRailsのコンポーネントの仕様を広く知っておくことで、だいぶ上達の近道になるかと思います。 経験者の方でもあまりRailsガイドを読んでない人がいますが、一読することはRailsを活用する上でよい経験となるはずです。

Rails ガイド https://railsguides.jp/active_support_core_extensions.html

GithubのActiveSupportの実態 https://github.com/rails/rails/tree/59984a3cea6d4ade34c3df3097fdd1d9ab26bf65/activesupport/lib/active_support