背景

  • 管理画面の開発では、リソースに対するCRUDができれば良いことが多い
  • コピペ的な作業になるため、scaffoldで作成したい
  • デフォルトのままだと使いづらいので、テンプレートをカスタマイズしたい
  • 不要なファイルが生成されることがあるので、抑制したい
    • Viewのテストファイルなど

参考にした記事

やったこと

テンプレートのカスタマイズ

テンプレートのコピー

  • bundle exec rails app:templates:copy で既存のテンプレートをコピー
  • カスタマイズしたいものだけを残す

カスタマイズ例(lib/templates/rails/scaffold_controller/controller.rb.tt)

  • moduleを指定している
  • 継承するControllerを指定している
  • indexアクションで、kaminariでページネーションするようにしている
module Admin
  class <%= controller_class_name %>Controller < AdminController
    before_action :set_<%= singular_table_name %>, only: %i[ show edit update destroy ]

    # GET <%= route_url %>
    def index
      @<%= plural_table_name %> = <%= orm_class.all(class_name) %>.page(params[:page]).per(params[:per]).order(id: :desc)
    end

# 以下省略

カスタマイズ例(lib/templates/erb/scaffold/index.html.erb.tt)

  • デフォルトのテンプレートではShowへのリンクしかないところを、Editへのリンクも描画している
  • ページネーションのコンポーネントを描画している
  • <%=を出力したい場合は、<%%=のようにエスケープする

<h1><%= human_name.pluralize %></h1>

<div>
  <%%= paginate @<%= plural_table_name %> %>
</div>

<div>
  <table>
    <thead>
      <tr>
        <th>id</th>
        <th></th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
      <tr>
        <td><%%= <%= singular_table_name %>.id %></td>
        <td>
          <%%= link_to "Show", <%= model_resource_name(singular_table_name) %> %>
        </td>
        <td>
          <%%= link_to "Edit", <%= edit_helper("#{singular_table_name}", type: :path) %>) %>
        </td>
      </tr>
      <%% end %>
    </tbody>
  </table>
</div>

<div>
  <%%= paginate @<%= plural_table_name %> %>
</div>

不要なファイル生成を抑制する

  • config/application.rbで下記を追加する
config.generators do |g|
  g.assets(false)
  g.helper(false)
  g.jbuilder(false)
  g.stylesheets(false)
  g.view_specs(false)
  g.routing_specs(false)
end

やりたいができていないこと

  • request_specファイルもカスタマイズしたい