Railsを支える基本概念の整理（RESTfulやリソースなど）


##概要
今更ながら本格的にRailsを触る事になったのでメモ。

Ruby on Rails Tutorialがとても良かったので、
そこで学んだエッセンスを自分なりに整理してみる。

Ruby on Rails Tutorial（chapter2）
http://railstutorial.jp/chapters/a-demo-app?version=4.0#top

##リソースとは
データモデルとwebインターフェイスが組み合わさったもの。

- データモデルとは
現実世界のあるモノを分類/抽象化して落とし込んだカタマリ
（より具体的にいえば（今回の文脈では）「RDBMSに則って設計されたデータ群」と同義）

 ##### 「User」を表すデータモデルのサンプル

|column|type|
|---|---|
|id|integer|
|name|string|
|email|string|

- webインターフェイスとは
データモデルをwebで取り扱えるようにしたもの

- つまりリソースとは
####HTTPプロトコル経由で自由にCURD（作成/読み出し/更新/削除）できる（分類された）データ群
とみなすことができる。

 なお、リソースはRESTという概念（後述）に基いている。

##リソースを生成するコード

```sh
$ rails generate scaffold User name:string email:string
$ rake db:migrate #マイグレーションファイルを実行（dbの作成）
```

##リソースに割り当てられるURL

ユーザーのURLをUsersリソースで使用するコントローラアクションに
割り当てる（マッピングする）コード。

```config/routes.rb
DemoApp::Application.routes.draw do
  resources :users
  ~
end
```
このコードは、 URLとアクションの組み合わせ↓を効率的に作成する。

Usersリソースにおける、ページとURLの関係。

|URL|	アクション|	用途|
|-----------|------------|------------|
|/users|	index|	すべてのユーザーを一覧するページ|
|/users/1|	show|	id=1のユーザーを表示するページ|
|/users/new|	new|	新規ユーザーを作成するページ|
|/users/1/edit|	edit|	id=1のユーザーを編集するページ|

##RailsのControllerの構成とそれを支えるREST

Scaffoldで作成されるControllerに含まれるアクションは以下7つ。

|HTTP Request|アクション|
|---|---|
|GET|index、show、new、edit|
|other| create、update、destroy|

index、show、new、editアクションはいずれも「ページ」に対応するが、
それ以外にもcreate、update、destroyアクションがある。

通常、これらのアクションは、ページ出力せずにDB上の情報を操作する
（ケースに応じてページを出力することもある）。

これらは全て「REST」に基づく。

##RESTとは
RESTとは、アプリケーションを構成するコンポーネント（Userなど）を、
・RDBMSのCRUD（Create/Read/Update/Delete）
・HTTPRequestの各メソッド（GET/POST/PUT/DELETE）
に対応させて、自由に作成/読み出し/更新/削除できるもの（リソース）として扱うアーキテクチャ。

####Usersリソースに含まれるRESTfulなルーティング一覧

|HTTP Request|	URL|	アクション|	用途|
|-----------|------------|------------|------------|
|GET|	/users|	index|	すべてのユーザーを表示するページ|
|GET|	/users/1|	show|	id=1のユーザーを表示するページ|
|GET|	/users/new|	new|	ユーザーを新規作成するページ|
|POST|	/users|	create|	ユーザーを作成するアクション|
|GET|	/users/1/edit	|edit|	id=1のユーザーを編集するページ|
|PATCH|	/users/1	|update|	id=1のユーザーを更新するアクション|
|DELETE|	/users/1|	destroy|	id=1のユーザーを削除するアクション|

URLには重複しているものが存在する。
たとえば、showアクションと updateアクションは、
どちらも/users/1というURLに対応している。
これらのアクション同士の違いは、それらのアクションに
対応するHTTP requestメソッドの違いでもある。


##もう一つリソースを実装してみる

####「Microposts」を表すデータモデルsample

|column|type|
|---|---|
|id|integer|
|content|string|
|user_id|integer|


```
$ rails generate scaffold Micropost content:string user_id:integer
$ rake db:migrate #マイグレーションファイルを実行（dbの作成）
```
microposts用のルーティングルールが追加された。

```config/routes.rb
DemoApp::Application.routes.draw do
  resources :microposts
  resources :users
  ~
end
```

##バリデーション（文字数制限）を入れてみる

```app/models/micropost.rb
class Micropost < ActiveRecord::Base
  validates :content, length: { maximum: 140 }
end
```

##リレーションを付ける

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :microposts
end
```
```app/models/micropost.rb
class Micropost < ActiveRecord::Base
  belongs_to :user
  validates :content, length: { maximum: 140 }
end
```

##Rails consoleを使って動作チェック

```sh
$ rails console

#Userモデルから任意のデータ（今回はid=2）を抽出、@testuserに代入
irb(main):006:0> @testuser = User.find(2)
=> #<User id: 2, name: "RailsBeginner", email: "rails@test.com", created_at: "2013-11-09 08:30:21", updated_at: "2013-11-09 08:30:21">

#@testuserが持っている（＝リレーションのある）micropostsデータを閲覧
irb(main):007:0> @testuser.microposts
=> #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 2, content: "rails post test", user_id: 2, created_at: "2013-11-09 08:30:48", updated_at: "2013-11-09 08:30:48">]>

irb(main):008:0> exit
```
便利。

##ついでにHerokuにデプロイ

```
$ heroku create
$ git push heroku master
$ heroku run rake db:migrate
```
http://afternoon-wildwood-5636.herokuapp.com/users
http://afternoon-wildwood-5636.herokuapp.com/microposts


##以下に続く
[Rails] RSpecによるBDD（振舞駆動開発）の基本 [SporkとGuardも]
http://qiita.com/kidachi_/items/cb8910eb74e924456df9