Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
272
Help us understand the problem. What is going on with this article?
@kidach1

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

More than 5 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

272
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kidach1
Qiitaの運営方針に疑問があるため、基本的に今後の投稿は考えていません。 主に https://twitter.com/kidach1 で活動報告しています。
aktsk
株式会社アカツキは、スマートフォンゲームの企画開発を中心に事業を展開しております。創業以来全てのゲームを内製しているため、高い技術ノウハウが蓄積されています。今後は、新規事業の立ち上げも行ってまいります。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
272
Help us understand the problem. What is going on with this article?