2012年11月7日水曜日

10日目:scaffoldって何やってるの?を通してRailsを学ぶ。

Rubyを勉強し始めてもう10日めになります。早いものです。
今日は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/usersindexすべてのuser情報を表示
GET/users/newnewuser作成画面を表示
POST/userscreateuserの作成
GET/users/:idshow一件のuser情報を表示
GET/users/:id/editedituser修正画面の表示
PUT/users/:idupdateuser修正
DELETE/users/:iddestroyuser削除

受け付けた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 件のコメント:

コメントを投稿