{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/how-to-work-backbone-with-rails/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"c238cbe3-b2f1-52c2-b5d1-2651dfbee2ec","excerpt":"Ruby on RailsはシンプルなAPIだけ構えておいて、 Backbone.jsをAPIクライアントとして連携させる際に Railsでコントローラをscaffold…","html":"<p>Ruby on RailsはシンプルなAPIだけ構えておいて、<br>\nBackbone.jsをAPIクライアントとして連携させる際に</p>\n<p>Railsでコントローラをscaffoldしただけでは上手く動かなかったため、<br>\n対処したことをメモしておきます。</p>\n<!--more-->\n<h2 id=\"各ライブラリのバージョン\" style=\"position:relative;\"><a href=\"#%E5%90%84%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3\" aria-label=\"各ライブラリのバージョン permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>各ライブラリのバージョン</h2>\n<p>使用している言語やライブラリのバージョンは以下のようになっています。</p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">項目</th>\n<th align=\"right\">バージョン</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\">Backbone.js</td>\n<td align=\"right\">1.1.0</td>\n</tr>\n<tr>\n<td align=\"left\">jQuery</td>\n<td align=\"right\">2.1.0</td>\n</tr>\n<tr>\n<td align=\"left\">Ruby</td>\n<td align=\"right\">1.9.3</td>\n</tr>\n<tr>\n<td align=\"left\">Ruby on Rails</td>\n<td align=\"right\">3.2.8</td>\n</tr>\n</tbody>\n</table>\n<p>Backbone側をあまりゴリゴリといじらず、<br>\n設定だけ書いておけばAjax出来る状態にしたいので、Rails側を調整していきます。</p>\n<h2 id=\"apiにアクセスする際に拡張子を省略\" style=\"position:relative;\"><a href=\"#api%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E7%9C%81%E7%95%A5\" aria-label=\"apiにアクセスする際に拡張子を省略 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>APIにアクセスする際に拡張子を省略</h2>\n<p>Backbone.Syncのデフォルトだと、<br>\nAjaxの叩き先が<code>GET /[name]s</code>となったり<code>POST /[name]s</code>等になっており、<br>\nscaffoldしたままのRailsのコントローラでは、<strong>拡張子を指定しないとレスポンスが返って来ません</strong>。</p>\n<p>どちらかを修正すれば済むので、今回はRails側を修正します。</p>\n<p>まず、Web APIが返すレスポンスのフォーマットは、<br>\n<code>respond_doブロック</code>の中に入っている<code>format.*</code>という指定で決まります。</p>\n<p><code>format.*</code>がアクセスする際の拡張子、<br>\n<code>render *</code>がレスポンスとして返されるフォーマットです。</p>\n<p>scaffoldされたコードは、こんな感じになっていると思います。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">TasksController</span> <span class=\"token operator\">&lt;</span> <span class=\"token constant\">ApplicationController</span>\n  <span class=\"token keyword\">def</span> <span class=\"token method-definition\"><span class=\"token function\">index</span></span>\n    <span class=\"token variable\">@tasks</span> <span class=\"token operator\">=</span> <span class=\"token constant\">Task</span><span class=\"token punctuation\">.</span>all\n\n    respond_to <span class=\"token keyword\">do</span> <span class=\"token operator\">|</span>format<span class=\"token operator\">|</span>\n      format<span class=\"token punctuation\">.</span>html <span class=\"token comment\"># index.html.erb</span>\n      format<span class=\"token punctuation\">.</span>json <span class=\"token punctuation\">{</span> render json<span class=\"token punctuation\">:</span> <span class=\"token variable\">@tasks</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">end</span>\n  <span class=\"token keyword\">end</span>  \n  <span class=\"token comment\"># ...</span>\n<span class=\"token keyword\">end</span></code></pre></div>\n<p>この指定だと、URLに<code>.html</code>と<code>.json</code>の拡張子をつけると、 それぞれそのフォーマットで返してくれるようになっています。</p>\n<p>ただし、<strong>それ意外の拡張子（指定なしを含む）を指定した場合、何も返って来ません。</strong></p>\n<p>ということで、全ての拡張子にマッチする指定してあげれば、うまくいきます。</p>\n<h2 id=\"railsのweb-apiのデフォルトフォーマットを指定する\" style=\"position:relative;\"><a href=\"#rails%E3%81%AEweb-api%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B\" aria-label=\"railsのweb apiのデフォルトフォーマットを指定する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>RailsのWeb APIのデフォルトフォーマットを指定する</h2>\n<blockquote>\n<p>respond_to でデフォルトフォーマットを指定する - The Second Longest Day in My Life…<br>\n<a href=\"http://d.hatena.ne.jp/tnksaigon/20110124/1295839007\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">http://d.hatena.ne.jp/tnksaigon/20110124/1295839007</a></p>\n</blockquote>\n<p>こちらの記事によると、respond_doの中に、<code>format.any</code>という指定ができるそうです。</p>\n<p>anyを指定すると、any以前に書いてあるフォーマット(<code>.html</code>, <code>.json</code>)にマッチしない全てのフォーマットに適用されます。<br>\nつまり、拡張子を省略した場合はこのanyで返されるフォーマットが適用されることになります。</p>\n<p>先ほどのコードにanyでjsonを返すコードを追加するとこうなります。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">TasksController</span> <span class=\"token operator\">&lt;</span> <span class=\"token constant\">ApplicationController</span>\n  <span class=\"token keyword\">def</span> <span class=\"token method-definition\"><span class=\"token function\">index</span></span>\n    <span class=\"token variable\">@tasks</span> <span class=\"token operator\">=</span> <span class=\"token constant\">Task</span><span class=\"token punctuation\">.</span>all\n\n    respond_to <span class=\"token keyword\">do</span> <span class=\"token operator\">|</span>format<span class=\"token operator\">|</span>\n      format<span class=\"token punctuation\">.</span>html <span class=\"token comment\"># index.html.erb</span>\n      format<span class=\"token punctuation\">.</span>json <span class=\"token punctuation\">{</span> render json<span class=\"token punctuation\">:</span> <span class=\"token variable\">@tasks</span> <span class=\"token punctuation\">}</span>\n      format<span class=\"token punctuation\">.</span>any <span class=\"token punctuation\">{</span> render json<span class=\"token punctuation\">:</span> <span class=\"token variable\">@tasks</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">end</span>\n  <span class=\"token keyword\">end</span>  \n  <span class=\"token comment\"># ...</span>\n<span class=\"token keyword\">end</span></code></pre></div>\n<p>これで、<code>/hoge/1</code>のような拡張子の無いURLでjsonを取得できるようになりました。</p>\n<h2 id=\"レスポンスの日付文字列をdateオブジェクトに変換する\" style=\"position:relative;\"><a href=\"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E6%97%A5%E4%BB%98%E6%96%87%E5%AD%97%E5%88%97%E3%82%92date%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B\" aria-label=\"レスポンスの日付文字列をdateオブジェクトに変換する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>レスポンスの日付文字列をDateオブジェクトに変換する</h2>\n<p>created_atやupdated_at、その他日付時間をDateオブジェクトとして受けとりたいときの対処法です。</p>\n<p>DATETIME型を表すJSON文字列は、<br>\nレスポンスとしてはStringで帰って来てしまうので、Backboneは文字列として解釈してしまいます。</p>\n<p>比較や計算をするためDateオブジェクトに変換したい場合には、<br>\n<code>Backbone.Model.prototype.parse</code>でパースしてあげます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> Task <span class=\"token operator\">=</span> Backbone<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">.</span><span class=\"token function\">extend</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    urlRoot<span class=\"token operator\">:</span> <span class=\"token string\">'/tasks'</span><span class=\"token punctuation\">,</span>\n\n    <span class=\"token function-variable function\">parse</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">.</span><span class=\"token function\">isString</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>created_at<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            res<span class=\"token punctuation\">.</span>created_at <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>created_at<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">.</span><span class=\"token function\">isString</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>updated_at<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            res<span class=\"token punctuation\">.</span>updated_at <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>updated_at<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">return</span> res<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>送信時は、明示的に文字列に再変換しなくとも文字列化して送信してくれます。</p>","timeToRead":4,"frontmatter":{"title":"Backbone.jsとRuby on Railsを連携させる際のメモ","tags":["Backbone.js","JavaScript","Ruby","Ruby on Rails"],"date":"December 10, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='135'%20viewBox='0%200%20400%20135'%20preserveAspectRatio='none'%3e%3cpath%20d='M20%2047c0%2031%200%2033%202%2032a1464%201464%200%200025-14l14%208%2014%207a736%20736%200%2000-1-66l-5%203a849%20849%200%2001-19%2011c-2%201-3%200-8-3l-14-8-8-4v34m156-26v10c5%204%2012-3%209-8-2-3-7-4-9-2M40%2043l-6%204%207%203%206%204%207-3%206-4-13-8-7%204m283%202c-5%202-5%205-5%2043l1%2034h56l3-2%202-3V44h-27l-30%201m35%204c1%203-5%204-8%202-1-2-2-2-4-1s-2%201%200%202c2%202%202%202-2%207-8%208-14%2025-14%2036v5h13c11%200%2012%200%2011-2-5-11-4-28%202-35l3-4%204%202c4%201%205%202%208%2010l3%2010%201-4c1-5-1-13-2-10v-1c0-2%200-3-2-4l-2-2h2l2-1h2l2-1c-1-2-10-7-13-7l-2-1-2-2c-2-1-2-1-2%201'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.9557522123893807,"src":"/static/690d77531b9decbfc9e430513bf42c66/741c1/featured-image.jpg","srcSet":"/static/690d77531b9decbfc9e430513bf42c66/466a3/featured-image.jpg 334w,\n/static/690d77531b9decbfc9e430513bf42c66/741c1/featured-image.jpg 604w","srcWebp":"/static/690d77531b9decbfc9e430513bf42c66/e33b9/featured-image.webp","srcSetWebp":"/static/690d77531b9decbfc9e430513bf42c66/cd98f/featured-image.webp 334w,\n/static/690d77531b9decbfc9e430513bf42c66/e33b9/featured-image.webp 604w","sizes":"(max-width: 604px) 100vw, 604px"}}}}}},"pageContext":{"slug":"/how-to-work-backbone-with-rails/","previous":{"fields":{"slug":"/codeiq-fizzbuzz-dungeon/"},"frontmatter":{"title":"CodeIQのFizzBuzzダンジョンLV1~4を解いた","tags":["fizzbuzz","JavaScript"]}},"next":{"fields":{"slug":"/improve-coding-speed-with-mou/"},"frontmatter":{"title":"Mouのショートカットを覚えて爆速コーディング","tags":["Markdown","Mou"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}