RoR入門第6回

6回目。なかなか進まない。


呼び出すレイアウトを名自邸に指定するときはこうするらしい。

layout レイアウト名


script/consoleコマンドを使用すればコンソールから直接RoRで作成したクラス、設定等を利用できる。

ruby script/console


ActiveRecordにはフックスクリプトがたくさん用意されている。
validateもそのひとつ。
DELETE文の発効後に実行されるのはafter_destroyメソッド。

def after_destroy
  // DELETE文の発効後に実行する処理
end


トランザクションは例外が発生すれば中断してロールバックする。
ロールバックするだけで例外をトランザクションの外に伝達したくないときはActiveRecord::Rollback例外を投げる。

if 例外をトランザクションの外に伝達したい
  raise メッセージ
else
  raise ActiveRecord::Rollback
end


ActiveRecordで関連をたどる。
1親等の関連先 → 2親等の関連先の場合。

has_many :2親等の関連先, :through => :1親等の関連先


Builderライブラリを使用してXMLを生成する。
actionメソッド。

respond_to do |format|
  format.xml {render :layout => false}
end

builderテンプレート。

xml.タグ名(:属性名 => 属性値) do
  xml.タグ名(タグ内容)
end


ActiveRecordXMLにする方法。
jsonにもできる。

respond_to do |format|
  format.xml {render :layout => false, 
    :xml => モデル.to_xml(:include => XMLに含めるモデル)}
end


Acceptヘッダを使用したレスポンス生成の分岐。
htmlとxmlのどちらが使われるかはAcceptヘッダでどちらが先に出てくるかで決まる。
明示的に".html" or ".xml"の拡張子を設定した場合はそちらが使用される。

respond_to do |format|
  format.html
  format.xml {render :layout => false}
end


rdocの生成。
プロジェクトの概略的な情報はdoc/README_FOR_APPに記述する。

rake doc:app


国際化。
今はあまり関心のあるトピックでないのでさらっと流す。
言語別に用意した.ymlファイルに各言語のメッセージを書いてI18n.tメソッドでメッセージの名前を指定する("t"だけでもいいっぽい)。
.ymlファイル

en:
  layout:
    title: メッセージ

.erbファイル

<%= I18n.t 'layout.title' %>

通貨に関してもRailsは色々手を尽くしてくれる。
i18n_generatorsを使えば日本語の国際化を楽チンにできるらしい。


テスト。
テスト用データベースを用意。

rake db:test:prepare

テストコード。

class テストクラス名 < ActiveSupport::TestCase
  test "テスト名" do
    m = モデル.new
    assert m.valid?
    assert !m.errors.invalid?(:プロパティ名)
    assert_equal 予想値, m.プロパティ
  end 
end

実行。

ruby -I test テストコードのパス

テスト用のデータベースの用意とテスト実行のショートカット。

rake test:units


テストデータをDBに入れる。
テストデータはフィクスチャデータというようだ。
フィクスチャデータはテーブル名.ymlで記述する。

test_data:
  カラム名: 内容

フィクスチャデータの追加い方。

fixtures :テーブル名

通常はtest/test_helper.rbにfixtures :allが設定されている。