目次
はじめに
Rubyの人気フレームワーク「Ruby on Rails」と、管理画面の制作でよく利用されるCSSの人気フレームワーク「AdminLTE」を利用して一覧画面、詳細画面、編集画面、登録画面を作成する手順を紹介します。
本記事では、一覧画面を作成しています。
[画面イメージ]
事前準備
AdminLTEの導入
AdminLTEの構築手順は下記の通り。
詳細はこちら
スポンサーリンク
Scaffoldで雛形を生成する
まずは便利な機能である「Scaffold」で、一覧、詳細、登録、更新画面の雛形を生成します。
rails g scaffold リソース名 カラム名1:データ型1 カラム名2:データ型2...
「Scaffold」で雛形を生成した後に、「migrate」でデータベースにテーブルを作成します。
PS C:\ruby\adminlte_sample> rails g scaffold user name:string address:text phone:string sex:integer mail_address:string email_permission:boolean invoke active_record create db/migrate/20200627230859_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml invoke resource_route route resources :users invoke scaffold_controller create app/controllers/users_controller.rb invoke erb create app/views/users create app/views/users/index.html.erb create app/views/users/edit.html.erb create app/views/users/new.html.erb create app/views/users/_form.html.erb invoke test_unit create test/controllers/users_controller_test.rb create test/system/users_test.rb create app/helpers/users_helper.rb invoke test_unit invoke jbuilder create app/views/users/index.json.jbuilder create app/views/users/show.json.jbuilder create app/views/users/_user.json.jbuilder invoke assets invoke scss create app/assets/stylesheets/users.scss invoke scss create app/assets/stylesheets/scaffolds.scss PS C:\ruby\test1> rails db:migrate == 20200627230859 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0037s == 20200627230859 CreateUsers: migrated (0.0085s) =============================
今回の例では、下記のテーブルを生成しています。
論理名 | 物理名 | データ型 |
ユーザー名 | name | string |
住所 | address | text |
電話番号 | phone | string |
性別 | sex | integer |
メールアドレス | mail_address | string |
メール受信許可 | email_permission | boolean |
「Scaffold」で雛形を自動生成すると「css」も生成されます。今回はAdminLTEを利用するので、自動生成された app/assets/stylesheets/scaffolds.scss ファイルは削除してください。
レイアウトファイルの修正
共通レイアウト(application.html.erb)
AdminLTE 適用のサンプルとして付属してくる「node_modules/admin-lte/starter.html」から、必要な項目のみを抽出して「app/view/layouts/application.html.erb」へ反映します。
スポンサーリンク
[app/view/layouts/application.html.erb]
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>管理画面</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> <!-- Google Font: Source Sans Pro --> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet"> <!-- Ionicons --> <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> </head> <body class="hold-transition sidebar-mini"> <div class="wrapper"> <!-- Navbar --> <nav class="main-header navbar navbar-expand navbar-white navbar-light"> <!-- ヘッダメニュー --> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a> </li> </ul> </nav> <!-- /.navbar --> <!-- サイドバー --> <aside class="main-sidebar sidebar-dark-primary elevation-4"> <!-- サイトロゴ --> <%= link_to "/users", class:"brand-link" do %> <span class="brand-text font-weight-light">管理画面</span> <% end %> <!-- Sidebar --> <div class="sidebar"> <!-- Sidebar Menu --> <nav class="mt-2"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false"> <li class="nav-item has-treeview menu-open"> <a href="#" class="nav-link active"> <i class="nav-icon fas fa-edit"></i> <p> ユーザー管理 <i class="right fas fa-angle-left"></i> </p> </a> <ul class="nav nav-treeview"> <li class="nav-item"> <%= link_to "/users", class:"nav-link" do %> <i class="far fa-circle nav-icon"></i> <p>ユーザー情報一覧</p> <% end %> </li> <li class="nav-item"> <%= link_to new_user_path, class:"nav-link" do %> <i class="far fa-circle nav-icon"></i> <p>ユーザー新規登録</p> <% end %> </li> </ul> </li> </ul> </nav> <!-- /.sidebar-menu --> </div> <!-- /.sidebar --> </aside> <!-- メインコンテンツ --> <div class="content-wrapper"> <%= yield %> </div> <!-- /.content-wrapper --> <!-- Main Footer --> <footer class="main-footer"> <!-- To the right --> <div class="float-right d-none d-sm-inline"> Anything you want </div> <!-- Default to the left --> <strong>Copyright © 2020 All rights reserved. </footer> <!-- ./wrapper --> </div> </body> </html>
application.html.erbは共通レイアウトであり、メインコンテンツは下記のように各画面のhtml.erbファイルで記述するようにしています。
<!-- メインコンテンツ -->
<div class="content-wrapper">
<%= yield %>
</div>
一覧画面(index.html.erb)
「node_modules/admin-lte/pages/tables/data.html」を参考に一覧画面の中身を作成していきます。
テーブルの表示は 「jQuery DataTables」プラグインを使用します。(※AdminLTEをインストールするとプラグインとして付与される)
[app/view/users/index.html.erb]
<p id="notice"><%= notice %></p> <%= javascript_pack_tag 'users/index' %> <!-- 上部 --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>ユーザー情報一覧</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><%= link_to 'ホーム' %></li> <li class="breadcrumb-item active">ユーザー情報一覧</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- テーブル --> <section class="content"> <div class="container-fluid"> <div class="row"> <div class="col-12"> <div class="card"> <!-- /.card-header --> <div class="card-body"> <table id="users_example" class="table table-bordered table-hover"> <thead> <tr> <th style="width:15%;">名前</th> <th>住所</th> <th style="width:10%;">電話番号</th> <th style="width:9%;">性別</th> <th style="width:15%;">メール</th> <th style="width:14%;">メール受信</th> <th style="width:20%;"></th> </tr> </thead> <tbody> <% @users.each do |user| %> <tr> <td><%= user.name %></td> <td><%= user.address %></td> <td><%= user.phone %></td> <td><% if user.sex == 0 then %>男<% else %>女<% end %></td> <td><%= user.mail_address %></td> <td><% if user.email_permission then %>許可<% else %>許可しない<% end %></td></td> <td><%= link_to '詳細', user, class:"btn btn-outline-primary btn-sm" %> <%= link_to '編集', edit_user_path(user), class:"btn btn-outline-primary btn-sm" %> <%= link_to '削除', user, method: :delete, class:"btn btn-outline-danger btn-sm", data: { confirm: '本当によろしいでしょうか?' } %></td> </tr> <% end %> </tbody> </table> </div> <!-- /.card-body --> </div> <!-- /.card --> </div> <!-- /.col --> </div> <!-- /.row --> </div> <!-- /.container-fluid --> </section> <!-- /.content -->
一覧画面のJSファイル(index.js)
「jQuery DataTables」を動作させるために「app/javascript/packs」配下に「users/index.js」を作成します。
そして「app/view/users/index.html.erb」に下記の記述を追記(2行目)し、作成したJavaScriptファイルを読み込むようにします。
<%= javascript_pack_tag 'users/index' %>
[app/javascript/packs/users/index.js]
import 'admin-lte/plugins/datatables/jquery.dataTables.min.js'; import 'admin-lte/plugins/datatables-bs4/js/dataTables.bootstrap4.min.js'; import 'admin-lte/plugins/datatables-responsive/js/dataTables.responsive.min.js'; import 'admin-lte/plugins/datatables-responsive/js/responsive.bootstrap4.min.js'; $(function() { $('#users_example').DataTable({ "paging": true, "lengthChange": true, "searching": true, "ordering": true, "info": true, "autoWidth": false, "responsive": true, "language":{ url: "http://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Japanese.json" } }); });
importで必要なjsファイル(node_modules/admin-lte/pages/tables/data.htmlで読み込んでいたjsファイル)を読み込み、$('#users_example').DataTableで「jQuery DataTables」プラグインを動作させるための設定をしています。
各項目の説明は下記の通り。
項目 | 説明 |
paging | ページング機能 |
lengthChange | 一覧に表示する件数を切り替える機能 |
searching | 検索機能 |
ordering | ソート機能 |
info | 情報の表示 |
autoWidth | 列幅の自動計算機能 |
responsive | レスポンシブ機能 |
language | 表示する言語 |
スポンサーリンク
その他
application.js
AdminLTEを使えるようにするために、application.jsに「require("admin-lte");」を追加しています。
[app/javascript/packs/application.js]
// This file is automatically compiled by Webpack, along with any other files // present in this directory. You're encouraged to place your actual application logic in // a relevant structure within app/javascript and only use these pack files to reference // that code so it'll be compiled. require("@rails/ujs").start() require("turbolinks").start() require("@rails/activestorage").start() require("channels") require("admin-lte"); // Uncomment to copy all static images under ../images to the output folder and reference // them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) // or the `imagePath` JavaScript helper below. // // const images = require.context('../images', true) // const imagePath = (name) => images(name, true)
environment.js
jQueryを動作させるために、environment.jsを下記のように修正しています。
[app/config/webpack/environment.js]
const { environment } = require('@rails/webpacker') const webpack = require('webpack') environment.plugins.prepend('Provide', new webpack.ProvidePlugin({ $: 'admin-lte/plugins/jquery/jquery', jQuery: 'admin-lte/plugins/jquery/jquery' }) ) module.exports = environment environment.toWebpackConfig().merge({ resolve: { alias: { 'jquery': 'admin-lte/plugins/jquery/jquery', } } });
動作確認
最後にRailsのサーバーを起動して動作確認してみます。
rails s
「 http://localhost:3000/users 」にアクセスして次のように表示、そして、ソートなどの「jQuery DataTables」プラグインの機能が正常に動作すれば完了です。
終わりに
本記事では「Rails + AdminLTEで一覧画面を作成する方法」について紹介しました。
次回は、Rails + AdminLTEで「登録画面」を作成する方法について紹介します。
- 準備編:Ruby on Railsの開発環境構築
- 入門編:Ruby on Railsで”Hello World”を作成する
- 基本編1:超便利ScaffoldでCRUDを作成する方法
- 基本編2:入力チェック(validates)の実装方法
- デザイン編1:RailsでBootstrapを導入する方法
- デザイン編2:RailsでAdminLTEを導入する方法
- 実践編1:Rails + AdminLTEで一覧画面を作成する
- 実践編2:Rails + AdminLTEで登録画面を作成する
- 実践編3:Rails + AdminLTEで編集画面を作成する
- 実践編4:Rails + AdminLTEで詳細画面を作成する