『Head First Rails』を読んで Rails をザックリ勉強しました。副題に「Rails の基本」とあるように、基本しか書かれていないのでテストやデプロイにはそれほど言及していません。ただし、Rails の概念がすんなり頭に入りますので、初学には最適だと思います。
以下、Rails に関するメモです。
環境
$ ruby --version ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-darwin10] $ rails -v Rails 2.3.4
ざっくり
config/coutes.rb に URL とコントローラのマッピングを定義して、app ディレクトリ以下の controllers/models/views に各コードを記述していく。MVC がそれぞれ名前によって結びついている。(Convention Over Configuration: 設定より規約)。
Rails アプリを作る
$ rails hoge
Web サーバ (WEBrick) を起動する
$ ruby script/server
スケルトンを作成する
$ ruby script/generate scaffold ticket name:string
scaffold モデル名 フィールド名:型 という書式で、フィールドは任意の数だけ定義できる。
テーブルを作成する
$ rake db:migrate
モデルにフィールドを追加する
$ ruby script/generate migration AddPhoneToTickets phone:string
migration Addフィールド名Toテーブル名 フィールド名:型 という書式。
scaffold を使わない場合
$ ruby script/generate model ad name:string $ ruby script/generate controller ads
script/generate でモデルとコントローラを個々に作成できる。モデルは単数形、コントローラは複数形にする。
ルーティングの設定
map.connect '/ads/:id', :controller=>'ads', :action=>'show'
コントローラからビューにデータを渡す
def show @ad = Ad.find(param[:id]) end
ビューはアクション名のファイルが自動的に使われる (views/ads/show.html.erb)。
<p> <strong>Name:</strong><%= @ad.name %> </p>
テンプレートの継承
app/views/layouts/ads.html.erb がテンプレートファイルとなる。
<%= yield %>
テンプレートの yield 部分に各アクションのビューが展開される。
フォームの書き方
フォームは form_for メソッドで作成する。
<% form_for(@ad, :url=>{:action=>'create'}) do |f| %> ... <%= f.text_field :name %> ... <% end %>
モデルには params としてフォームの値が渡ってくる。
モデルをデータベースに保存する
def create @ad = Ad.new(params[:ad]) if @ad.save redirect_to "/ads/#{@ad.id}" else render :action => 'new' end end
save で保存。
モデルの情報を更新する
def update @ad = Ad.find(params[:id]) if @ad.update_attributes(params[:ad]) redirect_to "/ads/#{@ad.id}" else render :action => 'edit' end end
モデルをデータベースから削除する
def destroy @ad = Ad.find(params[:id]) @ad.destroy redirect_to '/ads/' end
モデルの関連
複数のモデルを組み合わせる場合、例えば flights が幾つかの seat を持つ場合。
class Flight < ActiveRecord::Base has_many :seats end
lass Seat < ActiveRecord::Base belongs_to :flight end
バリデート
class ClientWorkout < ActiveRecord::Base validates_numericality_of :paid_amount validates_presence_of :trainer validates_presence_of :client_name end
モデルに validates_バリデート内容_of メソッドでチェック項目を記述する。また、モデルに validate という名前のメソッドを定義することもできる。
雑感
私は Ruby に関しては掲示板しか作ったことがない程度の経験値 (ほぼゼロ) ですが、Rails から入っても問題ありませんでした。
下記のような文法に違和感がありましたが Ruby はメソッド呼び出しの括弧を省略できると知り、すんなり読めるようになりました。
validates_presence_of :trainer
ECMAScript で記述するならば
validatesPresenceOf("trainer");
このようになります。