背景
- 管理画面の開発では、リソースに対するCRUDができれば良いことが多い
- コピペ的な作業になるため、scaffoldで作成したい
- デフォルトのままだと使いづらいので、テンプレートをカスタマイズしたい
- 不要なファイルが生成されることがあるので、抑制したい
参考にした記事
やったこと
テンプレートのカスタマイズ
テンプレートのコピー
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ファイルもカスタマイズしたい