実はこんなにある rails generate

熱いワールドカップが終わって平和な夜に戻ったshibuso です。Rails ユーザの皆さんは色々rails genarate コマンドを利用しているかと思いますが、この前調べていたら「こんなにあったのか!」となったので、今回Rails のgenerator を大まかに紹介してみます。Rails のバージョンは4.0.1 です。

実行結果をまとめてみました

結構数があるので先に目次を作っておきます。順番は重要そうなものだったり気の向くままだったりしていますので、大して意味はありません。

rails generate scaffold

これはもう使ったことがない人はいないレベルでメジャーじゃないでしょうか。モデル名を指定することによりRails のMVC モデルに則った各種ファイルを生成してくれます。article と入力して実行した結果は以下のとおりです(これより下、全て名前をarticle で実行しています)

$ rails g scaffold article
      invoke  active_record
      create    db/migrate/20140716040221_create_articles.rb
      create    app/models/article.rb
      invoke    test_unit
      create      test/models/article_test.rb
      create      test/fixtures/articles.yml
      invoke  resource_route
       route    resources :articles
      invoke  scaffold_controller
      create    app/controllers/articles_controller.rb
      invoke    erb
      create      app/views/articles
      create      app/views/articles/index.html.erb
      create      app/views/articles/edit.html.erb
      create      app/views/articles/show.html.erb
      create      app/views/articles/new.html.erb
      create      app/views/articles/_form.html.erb
      invoke    test_unit
      create      test/controllers/articles_controller_test.rb
      invoke    helper
      create      app/helpers/articles_helper.rb
      invoke      test_unit
      create        test/helpers/articles_helper_test.rb
      invoke    jbuilder
      create      app/views/articles/index.json.jbuilder
      create      app/views/articles/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/articles.js.coffee
      invoke    scss
      create      app/assets/stylesheets/articles.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

(※同プロジェクトで作っては消してを繰り返してたので、実行環境によって新規作成だったり既にあるのを使ったり、多少結果の見え方に違いが出ます)

rails generate scaffold_controller

scaffold と比べるとあまり使われていないのではないかと勝手に思っているのがこのscaffold_controller です。scaffold の実行で出力されるコントローラとビューと、それらに関わる部分を切り出した感じで生成します。モデルやアセットは作られません。モデルだけ先に作った場合、地味に便利です。

$ rails g scaffold_controller article
      create  app/controllers/articles_controller.rb
      invoke  erb
      create    app/views/articles
      create    app/views/articles/index.html.erb
      create    app/views/articles/edit.html.erb
      create    app/views/articles/show.html.erb
      create    app/views/articles/new.html.erb
      create    app/views/articles/_form.html.erb
      invoke  test_unit
      create    test/controllers/articles_controller_test.rb
      invoke  helper
      create    app/helpers/articles_helper.rb
      invoke    test_unit
      create      test/helpers/articles_helper_test.rb
      invoke  jbuilder
      create    app/views/articles/index.json.jbuilder
      create    app/views/articles/show.json.jbuilder

rails generate controller

コントローラを生成します。scaffold_controller との違いはRESTful な設計を特に考えない土台を作っているというところです。ビューに関してはディレクトリは作成されますが、中に誰もいませんよ中は空です。こちらはアセットを作っています。また入力した単語は複数形にならずそのまま使われます。

$ rails g controller article
      create  app/controllers/article_controller.rb
      invoke  erb
      create    app/views/article
      invoke  test_unit
      create    test/controllers/article_controller_test.rb
      invoke  helper
      create    app/helpers/article_helper.rb
      invoke    test_unit
      create      test/helpers/article_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/article.js.coffee
      invoke    scss
      create      app/assets/stylesheets/article.css.scss

rails generate resource

恥ずかしながらこの記事をまとめるまで、このコマンドは使ったことがありませんでした。scaffold と同じようにMVC モデルに沿って生成しますが、こちらはRESTful を意識していないようです。そのためコントローラの中身もビューも空です。

$ rails g resource article
      invoke  active_record
      create    db/migrate/20140716080820_create_articles.rb
      create    app/models/article.rb
      invoke    test_unit
      create      test/models/article_test.rb
      create      test/fixtures/articles.yml
      invoke  controller
      create    app/controllers/articles_controller.rb
      invoke    erb
      create      app/views/articles
      invoke    test_unit
      create      test/controllers/articles_controller_test.rb
      invoke    helper
      create      app/helpers/articles_helper.rb
      invoke      test_unit
      create        test/helpers/articles_helper_test.rb
      invoke    assets
      invoke      coffee
      create        app/assets/javascripts/articles.js.coffee
      invoke      scss
      create        app/assets/stylesheets/articles.css.scss
      invoke  resource_route
       route    resources :articles

rails generate model

モデルの生成と、テーブルをcreate するマイグレーションを生成します。

$ rails g model article
      invoke  active_record
      create    db/migrate/20140716040948_create_articles.rb
      create    app/models/article.rb
      invoke    test_unit
      create      test/models/article_test.rb
      create      test/fixtures/articles.yml

rails generate migration

scaffold に負けず劣らず有名ドコロです、使用頻度で考えるとscaffold よりも多いのではないでしょうか。カラムの型変更からテーブルの追加・削除まで、DB に関する各種変更の操作を記述可能なマイグレーションを生成します。

$ rails g migration AddNameToArticles
      invoke  active_record
      create    db/migrate/20140716052116_add_name_to_articles.rb

rails generate assets

アセットを生成します。最初のscaffold のところからそうですが、CoffeeScript とSass を導入しているためcoffee ファイルとscss ファイルが生成された例となっていますが、入っていない場合はそれぞれ普通のjs ファイルとcss ファイルになります。ここでは入力した単語は複数形にならずにそのまま用いられます。

$ rails g assets article
      invoke  coffee
      create    app/assets/javascripts/article.js.coffee
      invoke  scss
      create    app/assets/stylesheets/article.css.scss

rails generate helper

ヘルパーを生成します。合わせてテストも生成します。こちらも複数形にはなりません。

$ rails g helper article
      create  app/helpers/article_helper.rb
      invoke  test_unit
      create    test/helpers/article_helper_test.rb

rails generate generator

generator を generate します…って、これだけではいまいち理解できないですね。generate する時にgenerator を指定することができるみたいで、そのgenerator をまずgenerate するんだそうです。generator がゲシュタルト崩壊を起こしそう…。詳しくはRailsGuides 等を読んでいただけたらと思います。

$ rails g generator article
      create  lib/generators/article
      create  lib/generators/article/article_generator.rb
      create  lib/generators/article/USAGE
      create  lib/generators/article/templates

rails generate integration_test

インテグレーションテスト(総合テスト)のファイルを生成します。このファイルは他のgenerate コマンドでは作られません。

$ rails g integration_test article
      invoke  test_unit
      create    test/integration/article_test.rb

rails generate jbuilder

Jbuilder はJava の統合開発環境…ではなく、JSON をこねくりまわすシンプルなDSL です。scaffold でも生成されています。ビューはなくてもJbuilder のgenerate コマンドはあるんだな、と思ったり。

$ rails g jbuilder article
      create  app/views/articles
      create  app/views/articles/index.json.jbuilder
      create  app/views/articles/show.json.jbuilder

rails generate mailer

メーラーを生成します。こちらもintegration_test と同じで、このgenerate コマンドでしか作られません。

$ rails g mailer article
      create  app/mailers/article.rb
      invoke  erb
      create    app/views/article
      invoke  test_unit
      create    test/mailers/article_test.rb

rails generate task

Rake タスクを生成します。

$ rails g task article
      create  lib/tasks/article.rake

おわりに

今回はRails のgenerator のみ紹介しましたが、他にも色々generator は用意されているので、一度確認してみると良いかもしれません。下記コマンドで一覧が表示されます。

$ rails g -h

またここで紹介したのは生成されるファイルだけでしたが、ヘルプを見ると各種オプションも記載されているので、使用される際にはそちらも目を通してみると良いかと思います。scaffold の場合は下のようになります。

$ rails g scaffold -h
Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

shibuso

明治大学大学院理工学研究科を修了後ウェブ企業に就職。その後ソーシャルゲーム企業に転職し、後に登録会員数400万人を超えたタイトルのローンチを担当。2012年にBPSに入社。 Java, PHP, Perl, Rubyと渡り歩いて来ました。BPSに入社後RubyとRailsを使い始めましたが、今では一番好きな言語になっています。 休日の趣味はゲームと愛車のCBR250Rでのツーリングです。 たまにblog書いてます。http://www.shibuso.net

shibusoの書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ