「Ruby on Rails Tutorial」のサンプルアプリをAngularJSとBootstrap3を使う形にして作成します。前回、ホームページとユーザープロファイルページとフォロアー数を表示しましたが、この部分をクリックするとフォロアーの一覧をビュー内のメイン部に表示するように変更します。
(1)ホームページ
1)ビュー左ペインのフォロアー数の表示部分のリンクを変更
$ vi app/assets/templates/static_pages/home.html.erb
<div class="stats">
<a href="#" ng-click="following()">
<strong id="following" class="stat">
{\{chkSignin().followed_users.length}}
</strong>
following
</a>
<a href="#">
<strong id="followers" class="stat">
{\{chkSignin().followers.length}}
</strong>
followers
</a>
</div>
2)ビューのメイン部にフォロアー一覧を表示
“flg_follers”は初期はfalseで上記1)のリンクをクリックするとtrueになってメインビューに表示します。
:
<div class="col-sm-8">
<div ng-show="flg_follers" class="row">
<h1 class="text-center">{\{follow_title}}</h1>
<ul ng-repeat="f_user in f_users" class="users">
<li><img alt="{\{f_user.name}}" src="https://secure.gravatar.com/avatar/{\{hash(f_user.email)}}?s=52" />
<a href="/users/{\{f_user.id}}">{\{f_user.name}}</a>
</li>
</ul>
</div>
<h3>Micropost Feed</h3>
:
3)AngularJSスクリプトで関数を定義
$ vi app/assets/javascripts/mymodule.js.erb
myModule.controller("HomeCtrl", function($scope, flashService, micropostsResource, sessionResource, $filter) {
:
$scope.chkSignin = function() {
return flashService.getUser();
};
:
$scope.flg_follers = false;
$scope.following = function() {
$scope.flg_follers = true;
$scope.follow_title = "Following";
$scope.f_users = $scope.chkSignin().followed_users;
};
$scope.followers = function() {
$scope.flg_follers = true;
$scope.follow_title = "Followers";
$scope.f_users = $scope.chkSignin().followers;
};
$scope.hash = function(email) {
return md5(email.toLowerCase());
};
(2)ユーザープロファイルページ
ホームページの場合は、Feed一覧の上にフォロアー一覧を表示しましたが、ユーザープロファイルの場合は、マイクロポスト一覧をフォロアー一覧の表示を切り替えます。
初期状態はマイクロポスト一覧で、フォロアーのリンクをクリックするとマイクロポスト一覧からフォロアー一覧に切り替えます。
1)ビュー左ペインのフォロアー数の表示部分のリンクを変更
①フォロアー一覧のリンク部分にng-clickで関数を指定。
ホームページの場合と同様。
②フォロアー一覧を表示すると”view my profile”のリンクを表示し、マイクロポスト一覧に切り替えるためのリンクを表示させます。”flg_follers”の真偽によって切り替えます。
$ vi app/assets/templates/users/show.html.erb
<div class="col-xs-6 col-sm-4">
<h3>
<img alt="{\{user_info.user.name}}"
src="{\{user_info.gravatar_url}}?s=60"
class="gravatar" />
{\{user_info.user.name}}
</h3>
<span ng-show="flg_follers">
<a href="#" ng-click="viewProfile()">
view my profile
</a>
</span><br />
<div class="stats">
<a href="#" ng-click="following()">
<strong id="following" class="stat">
{\{user_info.followed_users.length}}
</strong>
following
</a>
<a href="#" ng-click="followers()">
<strong id="followers" class="stat">
{\{user_info.followers.length}}
</strong>
followers
</a>
</div>
</div>
2)ビューのメイン部にフォロアー一覧を表示
・フォロアー一覧の部分はホームページの場合と同様。
・”flg_follers”の真偽でマイクロポスト一覧とフォロアー一覧の表示を切り替える。
$ vi app/assets/templates/users/show.html.erb
<div class="col-xs-6 col-sm-8">
<div ng-show="flg_follers" class="row">
<h3>{\{follow_title}}</h3>
<ul ng-repeat="f_user in f_users" class="users">
<li><img alt="{\{f_user.name}}"
src="https://secure.gravatar.com/avatar/{\{hash(f_user.email)}}?s=52" />
<a href="/users/{\{f_user.id}}">{\{f_user.name}}</a>
</li>
</ul>
</div>
<div ng-hide="flg_follers" class="row">
<h3>Microposts({\{user_info.microposts.length}})</h3>
:
3)AngularJSスクリプトで関数を定義
$ vi app/assets/javascripts/mymodule.js.erb
myModule.controller("UsersShowCtrl", function($scope, $routeParams, userResource, flashService, $filter, micropostsResource, $q) {
:
userResource.show({ id: $routeParams.id }, function(response) {
$scope.user_info = response;
:
});
$scope.flg_follers = false;
$scope.following = function() {
$scope.flg_follers = true;
$scope.follow_title = "Following";
$scope.f_users = $scope.user_info.followed_users;
};
$scope.followers = function() {
$scope.flg_follers = true;
$scope.follow_title = "Followers";
$scope.f_users = $scope.user_info.followers;
};
$scope.viewProfile = function() {
$scope.flg_follers = false;
};
$scope.hash = function(email) {
return md5(email.toLowerCase());
};