##概要
今更ながら本格的に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 |
string |
-
webインターフェイスとは
データモデルをwebで取り扱えるようにしたもの -
つまりリソースとは
####HTTPプロトコル経由で自由にCURD(作成/読み出し/更新/削除)できる(分類された)データ群
とみなすことができる。
なお、リソースはRESTという概念(後述)に基いている。
##リソースを生成するコード
$ rails generate scaffold User name:string email:string
$ rake db:migrate #マイグレーションファイルを実行(dbの作成)
##リソースに割り当てられるURL
ユーザーのURLをUsersリソースで使用するコントローラアクションに
割り当てる(マッピングする)コード。
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用のルーティングルールが追加された。
DemoApp::Application.routes.draw do
resources :microposts
resources :users
~
end
##バリデーション(文字数制限)を入れてみる
class Micropost < ActiveRecord::Base
validates :content, length: { maximum: 140 }
end
##リレーションを付ける
class User < ActiveRecord::Base
has_many :microposts
end
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