Railsジェネレータのテンプレートをカスタマイズ

Ruby on Railsはscaffoldが有名です。rails generateコマンドによりREST構造のスケルトンを生成できるものです。このジェネレータはscaffold以外にもテンプレートを生成できます。rails g --helpからRails関連のジェネレータを抜粋すると以下のようなリストになります。

Rails:
  application_record
  assets
  channel
  controller
  generator
  helper
  integration_test
  jbuilder
  job
  mailbox
  mailer
  migration
  model
  resource
  scaffold
  scaffold_controller
  system_test
  task

また、ジェネレータのテンプレートをカスタマイズすることで、個別プロジェクトにより適したファイルを生成できます。
テンプレートは、gem付属のファイルがデフォルトですが、プロジェクトのlib/templates/に対応するファイルを置くと優先的に採用されます。

ベーステンプレートは railtiesのlib/rails/generators/から探します。先ほどのRailsジェネレータに対応するファイルは、概ねrails/ディレクトリにあります。scaffoldがscaffold_controllerを参照していたりするため、目的のファイルを探すところから始まります。

たとえば、controllerのテンプレートは rails/scaffold_controller/templates/controller.rb.ttを、プロジェクトのlib/templates/rails/scaffold_controller/controller.rb.ttにコピーすることでジェネレータから利用されます。
.erb.ttという形式は、ThorがパースしたうえでERBレンダリングするものですが、概ねERBです。

なお、テンプレートをオーバーライドすると、Railsのバージョンアップとは乖離していく点には注意が必要です。テンプレートのフォーマットはあまり変化がないものの、メジャーバージョンアップ時には対応する変更点を確認した方が安全です。

中馬崇尋
Chuma Takahiro