Rails

RailsTutorial 2日目

More than 3 years have passed since last update.

Ruby on Rails tutorial http://railstutorial.jp/ より、「第2章デモアプリケーション

RailsTutorial 1日目


新規RailsApp


  • rails new hogehoge

  • gemfileの用意

  • bundle install -- without production


Scaffold

rails generateスクリプトにscaffoldコマンドを渡すことで生成

scaffoldの引数にはリソース名を単数形にしたものとデータモデルの属性をオプションとしてパラメータに追加する

rails generate scaffold User name:string email:string

上のコマンドで下のテーブルのものが作成される。(idパラメータはRailsによって自動的に主キーとしてデータベースに追加されるため、追加不要)

Users table

id(integer)

name(string)

email(string)

データベースを更新し、usersデータモデルを作成する

bundle exec rake db:migrate

rails serverコマンドでWebサーバーを起動すると、以下のページが自動で生成されたのを確認することができる。

URL
用途

/users
すべてのユーザーを一覧するページ

/users/1
id=1のユーザーを表示するページ

/users/new
新規ユーザーを作成するページ

/users/1/edit
id=1のユーザーを編集するページ


bundleコマンドの復習とrakeコマンドについて

bundlerは、gemのパッケージ管理ツール。1日目でアプリケーションに必要なgemをbundlerでもってきていた。(bundle installなど)

gemでライブラリをインストールすると、マシン全体の環境で使用することができてしまうが、bundlerを使うことで、プロジェクト毎にgemを管理することができるようになる。

bundle execは、プロジェクトのライブラリ保存場所から呼び出しなさいというコマンド。

(参考:http://q.hatena.ne.jp/1353552605, http://ka-zoo.net/2013/07/difference-of-rake-xxx-and-bundle-exec-rake-xxx/)

rakeはコンパイルなどの処理を自動的におこなってくれるgem。

bundle exec rake -Tで、rakeコマンドでできることの一覧が表示できる。

bundle exec rake db:migrateは、プロジェクトのgemのrakeによって、db:migrateするということ。


上記ScaffoldからRailsにおけるMVCモデルの挙動について学ぶ


/usersというURLにアクセスしてブラウザに情報が表示されるまでの流れ


  1. ブラウザで/usersにアクセス(/usersというURLへのリクエストを発行)

  2. 【ルーティング】Rails routerがリクエストされたURL(/users)を、Usersコントローラ内のindexアクションに割り当てる

  3. indexアクションは、Usersモデルに、全てのユーザーを取り出せと指示する(User.all)

  4. Usersモデルはすべてのユーザーをデータベースから取り出す

  5. Usersモデルはユーザーの一覧をコントローラに返す

  6. コントローラはユーザーの一覧を@users変数に保存し、indexビューに渡す

  7. ビューはその中に埋め込まれているRubyを使用してHTMLを生成する

  8. コントローラは、生成されたHTMLをブラウザに返す

                      (4)モデルがデータベースと通信   

     
          (3)↓ ↑(5)
          
(1)ブラウザ → (2)Routing → (2)controller/actionがリクエストを処理
 (6)モデルから受け取った情報をviewに渡す
↓ ↑

(7)view生成


ルーティング (2の部分)


ルーティングとは、リクエストの内容を調べて、 そのリクエストを処理するコントローラとアクションを決定する処理のこと。

http://framework.zend.com/manual/1.12/ja/zend.controller.basics.html


config/routes.rbで、URLとアクションの組み合わせを作成していている。

URL(/users)とリクエストの種類(GET)に基づいて、適切なコントローラのアクションに割り当てられる(これをディスパッチという:ルーティングによってコントローラのアクションにディスパッチされる)。


コントローラ (3の部分)

コントローラー(今回の場合、app/contorollers/users_controller.rb)の中にアクションがまとめられている。1つのコントローラには関連するたくさんのアクションがまとめられている。


app/controllers/users_controller.rb

class UsersController < ApplicationController

.
.

def index #indexアクション
@users = User.all
end

def show #showアクション
.
.
end
.
.
end


indexアクションの@users = User.allによって、@usersという変数に、Userモデルからすべてのユーザーの一覧をとりだし保存している。

同じURLに複数のアクションが割り当てられている場合がある。(例えば、indexアクションとcreateアクション)。これは、HTTPリクエストメソッドが違うため、同じURLでも違うアクションが返ってくる。

HTTPリクエストメソッド
URL
アクション

GET
/users
index

POST
/users
create


モデル (4,5の部分)

UsersモデルからUser.allというリクエストに対して、以下のコードですべてのユーザーを返す。


app/models/user.rb

class User < ActiveRecord::Base

end

ActiveRecordはRubyライブラリ。


再びコントローラからビューへ (5,6,7の部分)

モデルから返ってきたすべてのユーザーが、@usersという変数に格納される。

コントローラーはビューを呼び出す。ビューの中では、@usersに格納された値を呼び出して使用することができる。

ex.)

<%= user.name %>

<%= user.email %>