いまさらですがActive Supportについて概要を説明します。
コラビットの川原です。
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 Hogecattr_accessor(:x) { 'default value' }endHoge.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