no_picture

Rails の自動読み込みの話

広島Ruby勉強会 #034で使用したネタの文に書きなおしました。 「Rails の自動読み込み規約を支える技術」と若干煽っておりますが 以下の内容はソースコードを読んで判断したことですべて正しいとは保証できないので参考にする程度にお願いします。 というわけで、Rails の自動読み込みの話をしたいと思います。 Rails の自動読み込みを支える技術 from Tomohiko Himura ### Rails のファイル読み込みの規約 Rails には[設定より規約](http://ja.wikipedia.org/wiki/%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84) という設計パラダイムが採用されています。 ファイルの自動読み込みの規約は 読み込みされていないクラス/モジュールがあった場合、名前から読み込みするファイルを判断できる というような規約があります。 例えば ``` Hoge - 'hoge.rb' を読み込む Hoge::Mogu - 'hoge/mogu.rb' を読み込む HogeMogu - 'hoge_mogu.rb' を読み込む ``` といった感じになっています。 この時、クラス名からファイル名の変換は `ActiveSupport::Inflector.underscore` が利用されます。 Rails では、自動読み込みは `RAILS_ROOT/app/models` のような `RAILS_ROOT/app/` の中のディレクトリに対し行われます。 `RAILS_ROOT/lib` とかに配置しても自動読み込みされません。 これを実現しているモジュールは [ActiveSupport::Dependencies](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/dependencies.rb) になります。 ### ActiveSupport::Dependencies Rails を使わない場合の使い方を紹介します。 ```ruby require 'active_support/dependencies.rb' ActiveSupport::Dependencies.autoload_paths LoadError: cannot load such file -- hoge/mogu ``` #### eager_autoload と auto_load!

no_picture

広島Ruby勉強会 #32 で 発表したこと - ActiveSupport, jenkins

広島Ruby勉強会 #032 で、紹介したこととか、喋ったこととかまとめときます。 広島Ruby勉強会の各発表は Github の Wiki に整理されてます。 Rails のソースコード読んでるので面白そうなメソッドを紹介する - ActiveSupport Core Ext すごい cron - Jenkins を試した 勉強会自体の感想は別のところに書きました。 Rails のソースコード読んでるので面白そうなメソッドを紹介する - ActiveSupport ここ最近はほぼ毎日 Rails のソースコードを読んで簡単にメモをとっています。います。 概ね毎日サボらずやれております。 この内容は railsdoc.eiel.info で垂れ流しています。 まずは、ActiveSupport から攻めています。特に Core Ext の部分を読んでいます。ということで、4月から6月の間に読んだものの中で、適当に抜粋して紹介しました。 内容はこちら その他には読んでいて気がついたことを残しています。 すごい cron - Jenkins を試した ローカルに Jenkins インストールして、これ cron の代わりに使えることに気づいたので、使用してみました。 その中で気づいたことや問題点についてお話をしました。 おまけで ruby 関連の Jenkins の Plugin についてわかったことを話しました。 すごい cron ? - Jenkins 試した from Tomohiko Himura 具体的な設定方法は まだ公開してないです。ごめんなさい。 また時間をとって書きたいと思います。 しかし、cron として使うにはメモリを食いすぎるので、Local

no_picture

ActiveSupport::Concern - Railsのソースとか読みはじめた 2

ActiveSupport::Concern - Railsのソースとか読みはじめたの続きになるのですが、 @netwillnet さんに。 ActiveSupport::Concernはモジュールが少しだけ書きやすくなるというメリットよりも、複数のモジュール同士に依存関係があったときにモジュール内でその依存関係をうまく解消させられるところに真価があるのでは https://twitter.com/netwillnet/status/270150759335723008 と素敵な突っ込みを頂いたので、rdocとソースコードと睨めっこしてきました。 睨めっこした結果の結論を書きたいと思います。 というわけで A -> B -> C という依存性があるモジュールを考えます。A には B が必要で。 B には C が必要という意味です。 module C def c "c" end end module B include C def b "b" + c end end class A include B def a "a" + b end end A.new.a と実行すると "abc" と出力されます。 これと同じことをクラスメソッドで実現しようとしてみます。 module C2 def c "c" end end module B2 def b "b" +

no_picture

ActiveSupport::Concern - Railsのソースとか読みはじめた

Railsのソースをちょろちょろ読むようにしている。読んで学んだことをメモしておきたい。だいたい読んだ当時の最新リリースを参考にします。 ActiveSupport::Concern を読みました。 このモジュールはモジュールの定義を手助けします。 クラスメソッドの定義場所をルール決めして include するだけで済むようにしたり、クラスのコンテキストで実行したい処理を書く場所を用意してくれます。 具体的にいきます。 以下のコードがあったとします。 class ConcernSample attr_accessor :hoge def self.mogu "mogu" end def goro "goro" end end これを以下のようにするだけで同じ機能を提供できるようにしたいと思います。 class ConcernSample include Sample end 処理を Sample モジュールにまとめたいということです。 これができると class ConcernSample include Sample end class ConcernSample2 include Sample end class ConcernSample3 include Sample end と、似たような機能をもつクラスを量産できます。 クラスに機能を追加するのが簡単になるという視点を持つとよいでしょう。 さて、Sample はどのように書くかということです。 ここで ActiveSupport::Concern を利用します。 require 'active_support' module Sample extend ActiveSupport::Concern included do attr_accessor :hoge end module ClassMethods def mogu "mogu"