« Ruby on Rails入門1日目 | メイン | Ruby on Rails入門3日目 »

2007年08月09日

Ruby on Rails入門2日目

Railsよ、オマエもか・・・・。
アプリを開発するのは新規プロジェクトばかりぢゃないんだよおぉぉ。。。(泣

2007年8月9日(木) wakhokサマースクール2007

■ViewとControllerの実習

テキストボックスに入力した値をオウム返しする、いわゆる挨拶
アプリをRailsを使って作成する実習
この実習ではデータベースへのアクセス(Modelの利用)はない。

■プロジェクトの作成

挨拶アプリ用のRailsのプロジェクトを作成するコマンドは以下の
通り。

C:\work\summer2007>rails hello

■Controllerの作成

C:\work\summer2007>cd hello
C:\work\summer2007\hello>ruby script/generate controller hello input greeting

上記コマンドでは、helloというControllerを作成するとともに
inputとgreetingというアクションを作成している。


■作成されたControllerを確認

作成された以下のファイルを確認する。

C:\work\summer2007\hello\app\controllers\hello_controller.rb

============================================================
class HelloController < ApplicationController

def input
end

def greeting
end
end
============================================================
コントローラ名は + "Controller"


■URLとコントローラの対応付け

http://localhost:3000/hello/input
http://localhost:3000/hello/greeting
hello がコントローラ名であり、inputとgreetingはアクション名
である。
※これはあくまでもデフォルトであってRoutingを変更すれば
変更可能である。


■Railsアプリケーションの動作

・DispatcherがRequestを受け取る (HTTP)
・コントローラとアクションを決定
・コントローラ中のアクションが処理
・ビューを処理

※仮想パス以下がどのような値でリクエストされても全てのリクエスト
をDispatcherが受け取って処理するようにHTTPサーバに設定してある。


■サーバ(Webrick)の起動

C:\work\summer2007\hello>ruby script/server

http://localhost:3000/hello/greeting
http://localhost:3000/hello/input


■View(input)のカスタマイズ

input.rhtmlを以下のように変更
============================================================

お名前を入力


<% form_tag :action => :greeting do %>
<%= text_field :input, :name %>
<%= submit_tag 'OK' %>
<% end %>
============================================================


■Controllerのカスタマイズ

hello_controller.rbのgreetingメソッドへ以下の記述を追加

============================================================
@str = @params.inspect
============================================================

inspectメソッドはJavaでいうtoString()メソッドである


■View(greeting)のカスタマイズ

greeting.rhtmlの中で以下のような処理を実施する

============================================================
<%= @str %>
============================================================

アクション(greetingメソッド)で作成(定義)されたインスタンス
変数はビューの中から参照(利用)する事が可能できる


■実行結果

============================================================
{"action"=>"greeting", "controller"=>"hello", "input"=>{"name"=>"あびる"}}
============================================================

この場合は上記のようにハッシュの内容がそのまま表示される


■課題1

greetingで入力された名前を表示する


■controllerのカスタマイズ

hello_controller.rbのgreetingメソッドを以下の通り変更

============================================================
def greeting
@name = @params[:input][:name]
end
============================================================


■View(greeting)のカスタマイズ

greeting.rhtmlの中を以下のように変更する

============================================================

ごあいさつ


<%= "こんにちは、#{@name}さん" %>
<% form_tag :action => :input do %>
<%= submit_tag '戻る' %>
<% end %>
============================================================


■クロスサイトスクリプティング(XSS)対策

<%= "こんにちは、#{@name}さん" %>

上記の記述だとXSS対策は一切なしの無防備状態になる。

<%=h "こんにちは、#{@name}さん" %>

上記のようにhを一文字加えるだけで最低限にXSS対策がされる。
このhもメソッドである。このメソッドのコードを確認することで
XSS対策の詳細を確認出来るのではないか、また、必要があれば
このメソッドをオーバライドすることでXSS対策に処理を追加
できるのではないかと思われる。(具体的なオーバライドの方法は
まだ、わからないけど。)


■課題2

時刻を表示するアクションとビューを追加する。

input.rhtmlに以下の記述を追加

============================================================
<% form_tag :action => :time do %>
<%= submit_tag '時刻表示' %>
<% end %>
============================================================


以下の内容でtime.rhtmlを作成

============================================================

現在時刻表示


<%= @timestamp %>
<% form_tag :action => :input do %>
<%= submit_tag '戻る' %>
<% end %>
============================================================


hello_controller.rbに以下のようなメソッドを追加

============================================================
def time
@timestamp = Time.new
end
============================================================


■Routing

アプリケーションにアクセスするためのURLパターンをデフォルトの
形式ではなく、変更したい時には、config/routes.rbを編集する。


■Modelの利用

============================================================
Class HelloModel
attr_accessor :name
end
============================================================

Rubyでは上記のように記載することでJavaのプロパティに相当する
インスタンス変数を確保出来る。setterやgetterメソッドを用意
する必要はない。(以前バージョンのRubyには、この省略表記が
なかった。)

HelloModelを記述するファイル名はhello_model.rb


■実習:書籍管理アプリの作成

書籍を管理するウェブアプリケーションをRailsで作成する。
基本的には昨日デモされたものと同じ


■database.ymlの修正

開発、テスト、本番の各DBに以下の2行を追加する。

password: password
encoding: utf8


■MySQLへrootスキーマで接続

C:\work\summer2007>C:\work\summer2007\mysql-5.0.45-win32\bin\mysql.exe
--user=root --password=password --socket=C:/work/summer2007/
mysql-5.0.45-win32/data/mysql.sock


■データベースの作成
以下のコマンドでMySQLの中にデータベースを作成する

============================================================
mysql> create database books_development;
mysql> create database books_test;
mysql> create database books_production;
============================================================

MySQLにおける「Database」という単位はOracleの表領域に近い
ようだが、それとも少し違う。少なくともOracleでいうデータベース
インスタンスとは意味が異なるので注意!


■Modelの作成

以下のコマンドでModelを作成

============================================================
C:\work\summer2007\books>ruby script/generate model book
title:string author:string publisher:string isbn:string
published_on:date
============================================================


■Modelの構成をDBに反映(移行:Migrate)する

以下の処理を実行することでDBオブジェクトが作成される

============================================================
C:\work\summer2007\books>rake db:migrate
============================================================


■データベースの情報を元にControllerやViewを作成する

これが、一大ブームを巻き起こしたという噂のアイツ(scaffold)だ!

============================================================
C:\work\summer2007\books>ruby script/generate scaffold Book
============================================================

scaffoldとは「(建築用の)足場を組む」というような意味がある
らしい。ようするにWebアプリのたたき台になる雛形を自動生成
してくれる処理である。


■サーバの起動

WEBrickを起動します。

============================================================
C:\work\summer2007> cd books
C:\work\summer2007\books> ruby script/server
============================================================


■Active Record

Railsでは、データベースへアクセスし、処理する際の手法として
Active Recordと呼ばれる設計パターンが用いられている。

Active Recordでは、データを保持する機能と、そのデータに対する
処理(振る舞い)の機能の両方を持っているオブジェクトを使って実現
する設計パターンのこと。データに対するアクセスはCreate、Read、
Update、Delete(CRUD)の4つに集約される。

※余談:
Railsでは、SQL文を直接ゴリゴリ書いて対処する方法も用意されて
いるらしい。SQLを自分で書かなきゃ安心できない人もこれで安心だ。


■books_controller.rbのもっともイヤラシイ記述

============================================================
def list
@book_pages, @books = paginate :books, :per_page => 10
end
============================================================

paginateメソッドは、:booksというシンボルの引数と:per_page
というハッシュの引数の計2つを取る。戻り値は配列型であり、
0番目の要素を@book_pagesへ代入し、1番目の要素を@booksに
代入している。


■rhtmlにおけるコードとデザインの分離問題

デザイナーとプログラマの共同作業と棲み分けをどうやって実現
するのか?

「デザイナとの共存なんて簡単だぞー。全部、キーワードに
しちゃえば、しちゃえばいいんだ!」

参考文献:キーワード型 rhtml
http://wota.jp/ac/?date=20070801


■既存のテーブルからModelを作成できるか?

結論:できないらしい。

そのほかにも主キーのカラムがIDという列名でなかったり、自動採番
のカラムでなかったりすると色々と面倒くさい事になるようだ。
う~ん、既存のテーブルをちょこっといじくるだけの簡単なアプリを
Railsで作ろうとする事は、おもったよりも困難な様子だ。

社員番号なんかの入力項目を主キーにしている場合って結構多そう
だから、この辺りの問題を簡単に解決してくれる手法がRailsの中に
組み込まれれば、もっと使いやすくなるんじゃなかろうか。


■フレームワークの有効性について

mixiの方のコメントでRailsの使い方を覚えた方が早いか、それとも
最初から自作した方が早いか、微妙なところではないかという意見
を頂きましたが、自作の場合、作成者の力量によって出来映えや
保守性、堅牢性などにバラツキが出る可能性があります。しかし、
フレームワークを有効活用すれば、そのフレームワークが到達して
いるレベルでの品質は最低限、確保する事ができます。こういった
意味では、ある程度時間を掛けてフレームワークを学習する価値は
あるのではないと考えます。

要するに腕の悪い料理人でも半調理品の食材を組み合わせて料理を
すれば、よっぽどの事をやらかさない限りそこそこの味のもんが
作れるというわけです。無論この場合、一流シェフの味には、負け
ますが、世間のお客様全てが一流シェフの味を求めているわけでは
ないので、こういったアプローチもアリだと思うわけですよ。(笑

投稿者 abiru : 2007年08月09日 19:05

トラックバック

このエントリーのトラックバックURL:
http://abiru.jp/blog/mt-tb.cgi/439

コメント

コメントしてください




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)