335
306

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-11-11

##概要
今更ながら本格的に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

335
306
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
335
306

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?