Ruby
Rails
RESTful

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

More than 3 years have passed since last update.


概要

今更ながら本格的に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という概念(後述)に基いている。


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

$ 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を使って動作チェック

$ 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