今日はRailsを勉強するために、Scaffoldコマンドで何が作られているか見てみます。
Scaffoldで何が作られているかを見るために同じ名前のアプリケーションを作って、両者を比較してみます。
mkdir app1
mkdir app2
rails new app1/Ins
rails new app2/Ins
Insという名前のRailsアプリが2つ作られました。差分をとってみます。
diff -r app1/Ins/ app2/Ins/
diff -r app1/Ins/config/initializers/secret_token.rb app2/Ins/config/initializers/secret_token.rb
< Ins::Application.config.secret_token = '48c1a18ac89c1f36559c8198b9fe6db349a00b5ca6c124b5adcb381d6f7f48ffd5099ddf14a014817322320c48a3470e122622f889ced3fddca12d139125fe81'
---
> Ins::Application.config.secret_token = 'f82af2a35a05272f49f0254a6ddc06678470e771e67afb6bab00bcba41432390046adfa3bb83f8f3e2d8de02f47141d945d0000d2e24914a325ff26eeb327572'
すると、config/initializers/secret_token.rbだけが差分があると言われます。この値はRailsのサイトによるとSessionに使われるそうです。
さて、昨日やったのと同じようにapp2の方にscaffoldを実行してみます。
cd app2/Ins/
rails generate scaffold user name:string tel:integer introduction:string
もとの場所に戻って、再度diffとってみます。
cd ../..
diff -r app1/Ins/ app2/Ins/
今度はさっきのsecret_token.rb以外に、以下のファイルが違うと言われます。
Only in app2/Ins/app/assets/javascripts: users.js.coffee
Only in app2/Ins/app/assets/stylesheets: scaffolds.css.scss
Only in app2/Ins/app/assets/stylesheets: users.css.scss
Only in app2/Ins/app/controllers: users_controller.rb
Only in app2/Ins/app/helpers: users_helper.rb
Only in app2/Ins/app/models: user.rb
Only in app2/Ins/app/views: users
Only in app2/Ins/db: migrate
Only in app2/Ins/log: development.log
Only in app2/Ins/test/fixtures: users.yml
Only in app2/Ins/test/functional: users_controller_test.rb
Only in app2/Ins/test/unit: helpers
Only in app2/Ins/test/unit: user_test.rb
diff -r app1/Ins/config/routes.rb app2/Ins/config/routes.rb
1a2,3
> resources :users
>
13個もあるので、重要っぽいのから見ていきます。
重要なのは、config/routes.rbかな?
routes.rbはアプリケーションで受け付けるURLを指定するスクリプトだそうです。
scaffoldによって、resources :users という一行が追加されてます。
この一行の意味は、以下のメソッド+URLの処理を受け付ける、という意味です。
| GET | /users | index | すべてのuser情報を表示 |
| GET | /users/new | new | user作成画面を表示 |
| POST | /users | create | userの作成 |
| GET | /users/:id | show | 一件のuser情報を表示 |
| GET | /users/:id/edit | edit | user修正画面の表示 |
| PUT | /users/:id | update | user修正 |
| DELETE | /users/:id | destroy | user削除 |
受け付けたURLはcontrollerで処理されるそうです。
そういえば、RubyはMVCモデルだそうです。
controllerで処理を受け付けて、modelでロジックを操作して、html.rbでページを返す。
J2EE5階層モデル、JSP - Servlet - Service - Entity - Persistence or Other System との比較はおいおい調べていきます。
閑話休題。
controllerは、app/controllersの中に置かれる、xxxx_controller.rbです。今回はusers_controller.rbですね。中を少し覗いてみます。
class UsersController < ApplicationController
# GET /users
# GET /users.json
def index
@users = User.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @users }
end
end
# GET /users/1
# GET /users/1.json
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
end
・
・
・
controllerは、ApplicationControllerを継承するクラスです。その中のメソッドがurlに応じて呼び出されます。例えばindexは/users で呼び出されます。
indexメソッドでは、
@users = User.all
インスタンス変数@usersにUserクラスのallラメソッドですべてのUserオブジェクトをDBカラ取得しています。このUserクラスはScaffoldで作られたModelクラスですね。ソースコードはapp/model/user.rbです。
次からの行、
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
respond_toはリクエストの形式に応じたレスポンスを返すことのできるメソッドで、この場合はhtmlもしくはjsonを返すことができるようになっています。
今日はここまで。
0 件のコメント:
コメントを投稿