Ruby on Rails Tutorial ユーザー一覧表示機能を作成

「Ruby on Rails Tutorial」のサンプルアプリをAngularJSとBootstrap3を使う形にして作成します。今回は、ユーザー一覧表示機能を作成します。

1)Rails側のコントローラに設定追加
 
ログインしている場合のみユーザー一覧表示できるようにします。
beforeフィルターに”index”アクションを追加します。
 
$ vi app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:index, :update]

  def index
    @users = User.all
    render json: @users
  end

 
2)AngularJSルート設定を確認
 
$ vi app/assets/javascripts/mymodule.js.erb

.when("/users", {
 templateUrl: "<%= asset_path('users/index.html.erb') %>"
 })

 
3)JavaScript-MD5を実装
 
gravatarを表示するため、JavaScript-MD5を実装します。個別のユーザー表示ビューでもgravatarを表示していましたが、その際はサーバー側でmd5ハッシュを作成していました。
 
今回はクライアント側でmd5ハッシュを生成してgravatarを表示します。
 
①ダウンロード
https://github.com/blueimp/JavaScript-MD5
 
②vendor/assets/javascripts/に配置
 
③インクルードの設定
$ vi app/assets/javascripts/application.js
 
//= require md5.min
 
4)ユーザー一覧のビューを作成
 
$ vi app/assets/templates/users/index.html.erb

<div ng-controller="UsersIndexCtrl">
  <h1 class="text-center">All users</h1>
  <ul ng-repeat="user in users" class="users">
    <li><img alt="{\{user.name}}" src="https://secure.gravatar.com/avatar/{\{hash(user.email)}}?s=52" />
      <a href="/users/{\{user.id}}">{\{user.name}}</a>
    </li>
  </ul>
</div>

 
5)スタイルシートの設定
 
$ vi app/assets/stylesheets/custom.css.scss

$grayLighter: rgb(238, 238, 238);

/* users index */

.users {
  list-style: none;
  margin: 0;
  li {
    overflow: auto;
    padding: 10px 0;
    border-top: 1px solid $grayLighter;
    &:last-child {
      border-bottom: 1px solid $grayLighter;
    }
  }
}

 
6)AngularJSコントローラを設定
 
ログインしていない場合は、ログイン画面に遷移させます。
 
$ vi app/assets/javascripts/mymodule.js.erb

myModule.controller("UsersIndexCtrl", function($scope, userResource, flashService, $location, sessionResource, $q) {
  var qgetUser = function(deferred) {
    if (flashService.getUser()) {
      var quser_info = flashService.getUser();
      deferred.resolve(quser_info);
    } else {
      sessionResource.current_user({}, function(response) {
        if (response.user.id) {
          var quser_info = response;
        } else {
          var quser_info = { user: {id: 0} };
        }
        flashService.setUser(quser_info);
        deferred.resolve(quser_info);
      });
    }
  }
  var deferred = $q.defer();
  deferred.promise.then(function (result) {
    var user_info = result;
    if (user_info.user.id > 0) {
      $scope.users = userResource.index();
    } else {
      $location.path("/signin");
    }
  },function (reason) {
    console.log("qgetUser-Error");
  })
  qgetUser (deferred);

  $scope.hash = function(email) {
    return md5(email.toLowerCase());
  };
});

 
7)ユーザー一覧のリンク
 
ナビゲーションメニューにユーザー一覧へのリンクを設定します。ログイン済みの場合のみ表示します。
 
$ vi app/views/layouts/_header.html.erb
 
<li ng-show="chkSignin().user.id > 0"><%= link_to "Users", "/users" %></li>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です