3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】gem draperを使用した時 rails g controller で decoratorのファイルを生成させない方法

Last updated at Posted at 2023-02-24

draperとは

draperはdecoratorを導入するためのgemとなります。
decoratorの役割やdraperの使い方などはここでは解説しないのでdraper知らないよって人は↓の記事などを見てみるといいかもです。

rails g controllerでdecoratorファイルが生成される

draperを導入した後に新しくコントローラーを追加するとdecoratorのファイルも自動で生成されると思います。

$ rails g controller tasks
      create  app/controllers/tasks_controller.rb
      invoke  erb
      create    app/views/tasks
      invoke  rspec
      create    spec/requests/tasks_spec.rb
      invoke  helper
      create    app/helpers/tasks_helper.rb
      invoke    rspec
      invoke  decorator
      create    app/decorators/task_decorator.rb
      invoke    rspec
      create      spec/decorators/task_decorator_spec.rb

ただ、このコントローラーのdecoratorは使う予定がないなどdecoratorを自動で生成したくない場合もあると思います。
そういった場合はgeneratorsの設定を変更することで自動生成させなくすることができます。

decoratorファイルを生成しない方法

config/application.rbg.decorator falseを追記します。

config/application.rb
    config.generators do |g|
      g.test_framework :rspec,
                       fixtures: false,
                       view_specs: false,
                       helper_specs: false,
                       routing_specs: false
      g.factory_bot false
      g.decorator false # 追加
    end

設定変更後にコントローラを生成してみると今度はdecoratorファイルが生成されなくなっていることが分かると思います。

$ rails g controller posts
      create  app/controllers/posts_controller.rb
      invoke  erb
      create    app/views/posts
      invoke  rspec
      create    spec/requests/posts_spec.rb
      invoke  helper
      create    app/helpers/posts_helper.rb
      invoke    rspec

設定変更後ももちろんrails g decoratorコマンドではdecoratorファイルを生成することができます。

$ rails g decorator post
      create  app/decorators/post_decorator.rb
      invoke  rspec
      create    spec/decorators/post_decorator_spec.rb

さらに詳しい説明

draperのソースコードを見てみるとControllerGeneratorhook_for :decoratorという記載があります。
これはrails g controllerした時にDecoratorGeneratorを呼び出すということを意味するので
generatorsの設定にg.decorator falseを設定することでdecoratorファイルの生成を止めることができるのでした。

lib/generators/controller_override.rb

require "rails/generators"
require "rails/generators/rails/controller/controller_generator"
require "rails/generators/rails/scaffold_controller/scaffold_controller_generator"

module Rails
  module Generators
    class ControllerGenerator
      hook_for :decorator, type: :boolean, default: true do |generator|
        invoke generator, [name.singularize]
      end
    end

    class ScaffoldControllerGenerator
      hook_for :decorator, type: :boolean, default: true
    end
  end
end

draper以外でももし他のgemを導入した時に自動で生成されるファイルがあってそれを無効にしたいときは
generatorsの設定にそのgemでフックしている名前を書くことで設定を変更できると思います。
ジェネレーターについてもっと詳しく知りたいって人はRailsガイドをみるといいかもです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?