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

この記事は最終更新日から5年以上が経過しています。

概要

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

kidach1
Qiitaの運営方針に疑問があるため、基本的に今後の投稿は考えていません。 主に https://twitter.com/kidach1 で活動報告しています。
aktsk
株式会社アカツキは、スマートフォンゲームの企画開発を中心に事業を展開しております。創業以来全てのゲームを内製しているため、高い技術ノウハウが蓄積されています。今後は、新規事業の立ち上げも行ってまいります。
http://aktsk.jp/
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
この記事は以下の記事からリンクされています
yoshito410kam神記事まとめからリンク
過去の3件を表示する
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした