「Ruby on Rails Tutorial」のサンプルアプリをAngularJSとBootstrap3を使う形にして作成します。今回は、ホームページにログイン済みユーザーのユーザー情報、マイクロポスト、gravatarの情報を表示するようにしました。
1)セッションコントローラを修整
新規ログインアクション(create)とログイン済みユーザー情報を返すアクション(current_user)にマイクロポストとgravatarの情報を追加するように修整しました。
$ vi app/controllers/sessions_controller.rb
def create
user = User.find_by(email: session_params[:email].downcase)
if user && user.authenticate(session_params[:password])
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.encrypt(remember_token))
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
microposts = user.microposts
@user_info = {
user: user,
gravatar_url: "https://secure.gravatar.com/avatar/#{gravatar_id}",
microposts: microposts
}
render json: @user_info, status: :accepted, location: user
else
msg = {"password" => ["Invalid email/password combination"]}
render json: msg, status: :unprocessable_entity
end
end
def current_user
remember_token = User.encrypt(cookies[:remember_token])
current_user ||= User.find_by(remember_token: remember_token)
if current_user
gravatar_id = Digest::MD5::hexdigest(current_user.email.downcase)
microposts = current_user.microposts
@user_info = {
user: current_user,
gravatar_url: "https://secure.gravatar.com/avatar/#{gravatar_id}",
microposts: microposts
}
render json: @user_info, status: :accepted
else
head :no_content
end
end
2)ユーザー新規登録時のAngularJSコントローラを修正
ユーザー新規登録時にユーザー情報を”flashService”に登録しますが、このときにgravatarの情報を登録するように修正します。
myModule.controller("UsersNewCtrl", function($scope, userResource, $location, flashService, $routeParams, sessionResource, $q) {
:
$scope.submit = function() {
function success(response) {
:
var user_info = {
user: response,
gravatar_url: "https://secure.gravatar.com/avatar/" + md5(response.email.toLowerCase())
};
flashService.setUser(user_info);
$location.path("/users/" + response.id);
}
3)ホームページを制御するAngularJSコントローラとビューを修整
①AngularJSコントローラ”HomeCtrl”を追加
$ vi app/assets/javascripts/mymodule.js.erb
myModule.controller("HomeCtrl", function($scope,flashService) {
$scope.chkSignin = function() {
return flashService.getUser();
};
});
②homeビューを修正
$ vi app/assets/templates/static_pages/home.html.erb
<div ng-controller="HomeCtrl">
<div ng-show="chkSignin().user.id > 0" class="row">
<div class="col-sm-4">
<a href="/users/{\{chkSignin().user.id}}">
<img alt="{\{chkSignin().user.name}}"
src="{\{chkSignin().gravatar_url}}?s=60"
class="gravatar"
/>
</a>
<h4>{\{chkSignin().user.name}}</h4>
<span><a href="/users/{\{chkSignin().user.id}}">view my profile</a></span><br />
<ng-pluralize count="chkSignin().microposts.length"
when="{'0': '0 micropost',
'one': '1 micropost',
'other': '{} microposts'}">
</ng-pluralize>
</div>
</div>
<div ng-hide="chkSignin().user.id > 0">
<div class="jumbotron">
<h1>Welcome to the Sample App</h1>
: