STEP7: REST API で Update

このステップでは、REST API経由でブックマーク情報を更新する方法および、MeteorクライアントからAPI経由でブックマーク情報を更新する方法について学びます。

7.1 ブックマーク更新API実装

前のステップで新規ブックマークを作成できるようになりました。

今度は、ブックマーク情報を更新するAPIを実装してきましょう。

ソースコードを以下のように修正してください。

imports/api/rest.js

// ...省略

Api.addRoute('bookmarks/:id', { 
  // GET /api/bookmarks/:id
  get: { 
    // ...省略
  },
  // PUT /api/bookmarks/:id
  put: { 
    action: function() { 
      const bookmarkId = this.urlParams.id;
      const { url, title } = this.bodyParams; 
      Bookmarks.update(bookmarkId, { $set: { url, title }}); 
      return { 
        status: 'success', 
        data: Bookmarks.findOne(bookmarkId), 
      };
    }, 
  },
});

export default Api;

変更を保存したら、ターミナルで以下のコマンドを実行します。

curl -X PUT http://localhost:3000/api/bookmarks/<ブックマークID> -d "url=<ブックマークURL>" -d "title=<ブックマークタイトル>"

<ブックマークID>, <ブックマークURL>, <ブックマークタイトル>は各自書き換えて下さい。

実行例:

$ curl -X PUT http://localhost:3000/api/bookmarks/4BBv9JQ4dxJtvMC7X -d "url=http://localhost:3000/" -d "title=localhost"
{ 
  "status": "success", 
  "data": { 
    "_id": "4BBv9JQ4dxJtvMC7X", 
    "url": "http://localhost:3000/", 
    "title": "localhost", 
    "createdAt": "2016-07-22T23:24:39.176Z" 
  }
}

ここまでのコード: https://github.com/j-hack/meteor-rest-app/tree/step7.1

7.2 ブックマーク更新フォーム作成

続いて、ブックマーク更新フォームを実装していきましょう。

ソースコードを以下のように書き換えます。

client/main.html

<!-- 省略 -->

<template name="Bookmarks"> 
  <!-- 省略 -->
</template>

<!-- 変更 -->
<template name="Bookmark">
  <li class="list-group-item"> 
    <a href="{{bookmark.url}}" target="_blank"> 
      <span class="bookmark-title">{{bookmark.title}}</span> 
      <span class="bookmark-url">{{bookmark.url}}</span> 
      {{#unless isEditMode}}
        <button class="btn btn-xs btn-default btn-bookmark-edit js-edit-bookmark">Edit</button> 
      {{/unless}} 
    </a>
   {{#if isEditMode}} 
     {{> BookmarkForm bookmark=bookmark callbacks=callbacks}} 
   {{/if}} 
  </li>
</template>

<!-- 変更 -->
<template name="BookmarkForm">
  <form class="form-inline bookmark-form {{#if bookmark}}is-edit{{else}}is-new{{/if}}"> 
    {{#if bookmark}} 
      <input type="hidden" name="_id" value="{{bookmark._id}}" /> 
    {{/if}} 
    <div class="form-group"> 
      <label for="url">URL</label> 
      <input type="url" class="form-control" id="url" name="url" placeholder="http://..." value="{{bookmark.url}}"/>
    </div>
    <div class="form-group">
      <label for="title">Title</label> <input type="text" class="form-control" id="title" name="title" value="{{bookmark.title}}" />
    </div>
    <button type="submit" class="btn btn-default"> 
      {{#if bookmark}}Update{{else}}Add{{/if}} 
    </button> 
  </form>
</template>

client/main.js

// ...省略

// 追加
Template.Bookmark.onCreated(function() { 
  this.isEditMode = new ReactiveVar(false);
});

// 追加
Template.Bookmark.helpers({ 
  isEditMode: () => Template.instance().isEditMode.get(), 
  callbacks: () => { 
    const inst = Template.instance(); 
    return { 
      onUpdate: () => inst.isEditMode.set(false), 
    }; 
  },
});

// 追加
Template.Bookmark.events({ 
  'click .js-edit-bookmark'(event, inst) { 
    event.preventDefault(); 
    inst.isEditMode.set(true); 
  }
});

Template.BookmarkForm.events({ 
  // 変更(キーに.is-newを付加)
  'submit .bookmark-form.is-new'(event) { 
    // ...省略
  }, 
  // 追加
  'submit .bookmark-form.is-edit'(event, inst) { 
    event.preventDefault();
    const _id = event.target._id.value; 
    const url = event.target.url.value; 
    const title = event.target.title.value; 
    const callOptions = {data: {url, title}};

    HTTP.put(`/api/bookmarks/${_id}`, callOptions, (err, res) => { 
      if (err) { console.log(err); return; } 
      this.callbacks.onUpdate(); 
    }); 
  },
});

NOTE: HTTP.put() で指定したリソースに対してPUTリクエストを実行します。

変更を保存したら、ブラウザで挙動を確認してみましょう。

これでブックマーク情報の更新ができるようになりました。

ここまでのコード: https://github.com/j-hack/meteor-rest-app/tree/step7.2

次のステップに進みましょう。

results matching ""

    No results matching ""