Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

Ruby on Rails Tutorial ユーザー編集機能を作成

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

(1)Railsコントローラのupdateアクション定義を追加

$ vi app/controllers/users_controller.rb

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

(2)AngularJSのルート設定

パーシャルビューをユーザー登録と共用します。
$ vi app/assets/javascripts/mymodule.js.erb

myModule = angular.module('myModule', ['ui.bootstrap','ngRoute','ngResource']);

myModule.config(function($routeProvider, $locationProvider) {
  $locationProvider.html5Mode(true);
  $routeProvider
  :
    .when("/users/:id/edit", {
     templateUrl: "<%= asset_path('users/new.html.erb') %> "
     })

(3)AngularJSコントローラの設定

登録用に定義したAngularJSコントローラとビューに編集用の機能を追加します。

1)仕様

①登録と編集で共用し、切り替える部分

・ページヘッダー部のタイトル
$scope.title = "Sing up";
$scope.title = "Update your profile";

・ボタンの名前
$scope.btn_name = "Create my account";
$scope.btn_name = "Save changes";

・登録・編集成功後のフラッシュメッセージ
var msg = "Welcome to the Sample App!";
var msg = "Profile updated";

②編集のみに使用する機能

・フォームの各入力欄に現状の設定値を表示
・ユーザーのグラバターを表示

2)AngularJSコントローラを修正

$routeParams.idの有無に応じて登録と編集の処理を切り替えます。

$ vi app/assets/javascripts/mymodule.js.erb

myModule.controller("UsersNewCtrl", function($scope, userResource, $location, flashService, $routeParams) {
  if ($routeParams.id) {
    var msg = "Profile updated";
    $scope.title = "Update your profile";
    $scope.btn_name = "Save changes";
    userResource.show({ id: $routeParams.id }, function(user_info) {
      $scope.user = user_info.user;
      $scope.gravatar_url = user_info.gravatar_url;
    })
  } else {
    var msg = "Welcome to the Sample App!";
    $scope.title = "Sing up";
    $scope.btn_name = "Create my account";
    $scope.user = new userResource();
  }
  $scope.submit = function() {
  :
    if ($routeParams.id) {
      userResource.update($scope.user, success, failure);
    } else {
      userResource.create($scope.user, success, failure);
    }
  };

※Railsコントローラのshowアクションの定義内容

  def show
    user = User.find(params[:id])
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    @user_info = {
      user: user,
      gravatar_url: "https://secure.gravatar.com/avatar/#{gravatar_id}"
    }
    render json: @user_info
  end

(4)AngularJSビューの修正

ページヘッダー部のタイトル、ボタン名の部分を変更し、グラバターの部分を追加します。

$ vi app/assets/templates/users/new.html.erb

<h1 class="text-center">{\{title}}</h1>
  :
<button ng-click="submit()" class="btn btn-primary"
         ng-disabled="userNewForm.$invalid" >
  {\{btn_name}}
</button>
  :
<span ng-show="user.id">
  <img alt="{\{user.name}}" src="{\{gravatar_url}}" />
  <a href="http://gravatar.com/emails">change</a>
</span>

(5)ナビゲーションメニューにユーザー編集メニュー追加

ヘッダー部のメニューにユーザー編集へのリンクを追加します。

$ vi app/views/layouts/_header.html.erb

<li><%= link_to "Settings", "/users/{\{chkSignin().user.id}}/edit" %></li>