Railsのgenerateコマンドを俺好みに設定する

rails

Railsのscaffold便利ですよね。コマンド一発でrestfulな構造を作ってくれます。
しかしデフォルトではテストフレームワークがtest unitであったり、cssやjsを逐一作ったり、と場合によっては抑制したい挙動もあります。
実はこのscaffoldはユーザがカスタマイズすることができます。
更にいうとscaffoldだけではなくgenerateコマンド全般に対して設定できます。

ということで、今回は理想のgenerateコマンドを求めてその設定方法を見ていきたいと思います。

Scaffoldの設定方法

generateコマンドの挙動はconfig/application.rbで設定することができます。
例えば、こんな感じです。

1
2
3
4
5
class Application < Rails::Application
  config.generators do |g|
    g.helper false
  end
end

これはController生成時にhelperを作らない、という設定です。
では、この設定のgenerateコマンドの結果を未設定時とくらべてみましょう。

未設定時

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% bundle exec rails g controller product
      create  app/controllers/product_controller.rb
      invoke  slim
      create    app/views/product
      invoke  test_unit
      create    test/controllers/product_controller_test.rb
      invoke  helper
      create    app/helpers/product_helper.rb
      invoke    test_unit
      create      test/helpers/product_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/product.js.coffee
      invoke    scss
      create      app/assets/stylesheets/product.css.scss

設定時

1
2
3
4
5
6
7
8
9
10
11
% bundle exec rails g controller product
      create  app/controllers/product_controller.rb
      invoke  slim
      create    app/views/product
      invoke  test_unit
      create    test/controllers/product_controller_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/product.js.coffee
      invoke    scss
      create      app/assets/stylesheets/product.css.scss

いかがでしょうか?設定時にはhelperの生成がなくなっているのがわかりますね。
こんな感じで自分に適したgeneratorコマンドを設定することができます。

それでは、何を設定していいかはどこからわかるのでしょうか?
実はここで設定しているのはg scaffoldで指定できるオプションなのです。 g scaffoldのオプションを見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
% bundle exec rails g scaffold
Usage:
  rails generate scaffold NAME [field[:type][:index] field[:type][:index]] [options]

Options:
      [--skip-namespace], [--no-skip-namespace]  # Skip namespace (affects only isolated applications)
  -o, --orm=NAME                                 # Orm to be invoked
                                                 # Default: active_record
      [--force-plural], [--no-force-plural]      # Forces the use of a plural ModelName
      [--model-name=MODEL_NAME]                  # ModelName to be used
      [--resource-route], [--no-resource-route]  # Indicates when to generate resource route
                                                 # Default: true
  -y, [--stylesheets], [--no-stylesheets]        # Generate Stylesheets
                                                 # Default: true
  -se, [--stylesheet-engine=STYLESHEET_ENGINE]   # Engine for Stylesheets
                                                 # Default: scss
      [--assets], [--no-assets]                  # Indicates when to generate assets
                                                 # Default: true
  -c, --scaffold-controller=NAME                 # Scaffold controller to be invoked
                                                 # Default: scaffold_controller

ActiveRecord options:
      [--migration], [--no-migration]    # Indicates when to generate migration
                                         # Default: true
      [--timestamps], [--no-timestamps]  # Indicates when to generate timestamps
                                         # Default: true
      [--parent=PARENT]                  # The parent class for the generated model
      [--indexes], [--no-indexes]        # Add indexes for references and belongs_to columns
                                         # Default: true
  -t, [--test-framework=NAME]            # Test framework to be invoked
                                         # Default: test_unit

TestUnit options:
      [--fixture], [--no-fixture]   # Indicates when to generate fixture
                                    # Default: true
  -r, [--fixture-replacement=NAME]  # Fixture replacement to be invoked

ScaffoldController options:
  -e, [--template-engine=NAME]  # Template engine to be invoked
                                # Default: slim
      [--helper]                # Indicates when to generate helper
      [--jbuilder]              # Indicates when to generate jbuilder
                                # Default: true

Slim options:
  [--form-builder=NAME]  # Form builder to be invoked

Asset options:
  -j, [--javascripts], [--no-javascripts]       # Generate JavaScripts
                                                # Default: true
  -je, [--javascript-engine=JAVASCRIPT_ENGINE]  # Engine for JavaScripts
                                                # Default: coffee

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

ここではTestUnitのオプションが表示されていますが、config/applcation.rb

1
2
3
4
5
class Application < Rails::Application
  config.generators do |g|
    g.test_framework :rspec
  end
end

とテストフレームワークを指定してやると、Rspecのオプションが表示されるようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Rspec options:
  [--fixture], [--no-fixture]                    # Indicates when to generate fixture
  [--fixture-replacement=NAME]                   # Fixture replacement to be invoked
  [--singleton], [--no-singleton]                # Supply to create a singleton controller
  [--controller-specs], [--no-controller-specs]  # Generate controller specs
                                                 # Default: true
  [--view-specs], [--no-view-specs]              # Generate view specs
                                                 # Default: true
  [--helper-specs], [--no-helper-specs]          # Generate helper specs
                                                 # Default: true
  [--routing-specs], [--no-routing-specs]        # Generate routing specs
                                                 # Default: true
  [--integration-tool=NAME]                      # Integration tool to be invoked
                                                 # Default: test_unit

これらのオプションから自分の好きなようにgeneratorコマンドをカスタマイズしていきましょう。

オレオレ設定

僕が普段使っている設定はこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Application < Rails::Application
  config.generators do |g|
    g.orm :active_record
    g.assets false
    g.helper false
    g.test_framework :rspec,
      fixture: true,
      fixture_replacement: :factory_girl,
      view_specs: false,
      routing_specs: false,
      helper_specs: false,
      integration_tool: false
  end
end

ご覧のとおり、

  • css, jsは生成しない
  • helperは生成しない
  • テストフレームワークはrspec
    • fixtureはFactoryGirl
    • view, routing, helper, integrationテストは生成しない

という設定になっています。

自分の思い通りのgeneratorコマンドはストレスがなくてオススメですよ!

Comments