on Rails : depot

AWDwRを読みながら進めますRails独習.第二部はDepot(ショッピングカートアプリケーション)を実際に作ってみようというお話.なんだけど,いちいちAWDwRの全てを書く気はさらさらなく,おぼえがき程度に書き留めておく.

データベース

データベースを,まず3つ作る.開発用(development)と,テスト用(test),そして本番用(production).


名前の付け方は,depot_development,depot_test,depot_productionという規則でつける.この制約がとても役に立ち,アプリケーションの開発をより楽にしてくれる.また,grantでアクセス権限の定義もしてやらないといけない.そうでないと,わざわざ3つに分ける意味が無い.


ソースコードの中に,データベースにアクセスするためのユーザ名とパスワードを書かなければいけなかった今までのアプリケーションってのは,言うまでもなく危険.さらに柔軟性も低く,お世辞にも保守し易いとは言えない.
アプリケーションの開発中には開発用のデータベースを,テスト中にはテスト用のデータベースを,そして本番は本番用のデータベースを使うことになるのだが,使用するデータベースを切り替える度にソースコードを弄ってユーザ名とパスワードを書き換えないといけない.

アプリケーションを本番環境に切り替えるときに限って,パスワードを間違える

のがプログラミングの法則だそうな.そこで,賢い開発者は,接続情報をコードの外に置く.それがRailsの場合,config/database.ymlなのね.これはある意味設定ファイルと呼んで良いのかな.

テーブル定義

データベースのテーブルを作る.大文字と小文字は区別されるため,idはちゃんと小文字でidと入力するようにしなければならない.これも制約.下のDLLはAWDwRのもの.

drop table if exists products;
create table products(
  id  int not null auto_increment,
  title varchar(100)  not null,
  description text  not null,
  image_url varchar(200)  not null,
  price decimal(10,2) not null,
  primary key(id)
);

というふうなDLLを作成しておくと,後々便利.たとえば,スキーマに列を追加したいとき,こういうファイルを残しておくと,バージョンごとに履歴が取れる.
関係無いけれど,priceはコレ,アメリカナイズされていると言うか,何ドル何セントみたいな書き方をしたいだけだし,日本ならintで良いよね.

管理アプリケーション作成

データベースを作り,テーブルを定義し,ymlを書いたらやっとscaffold.

depot $ ruby script/generate scaffold Product Admin

ここで,Productはモデルの名前.一文字目は大文字.これも規則があり,モデルの名前は単数系,テーブルの名前はその複数形になっている.
Adminはコントローラの名前.これはRailsの方で定義されている名前?そして,モデルやコントローラの一文字目が大文字なのは,どういう規則から?そういうところを,はじめの方にちゃんと書いて欲しいな.


何はともあれ,こうするだけで,勝手にAdminコントローラに幾つかのアクションが自動生成されてるってのが凄い.実際にapp/controllers/admin_controller.rbを見てみると,既に

  • index
  • list
  • show
  • new
  • create
  • edit
  • update
  • destroy

といったアクションが書かれている.renderって何だろう,verifyって何だろうと興味をそそられました.また,app/models/product.rbも一緒に作られているようなので見てみるも,なにもメソッドの定義はありません.これはまた弄らなくて良いのね.他には,大量のビュー,ヘルパー,yml,さらにはcssまで作成されました.scaffoldはかなりの量のルーチンワークをやってのけたようです.


さて,ここでscript/serverを起動し,http://localhost:3000/admin/を尋ねると,立派なウェブアプリがもう出来ていました.凄いなぁ.ホント凄いなぁしか言ってないよ.

列の追加

さて,とんだ手違いにより,列の追加をしなければ行けなくなりました.先ほどのDLLに列を追加し,もう一度scaffold.ここで,AWDwR

overwrite app/views/admin/_form.rhtml? [Ynaq]

で"a"を選択するように言ってますけど,Yでもなんだか出来た.そう,ただ間違っただけ.ログでは,この_form.rhtmlだけがforceで,他の変更されそうなヤツはforceじゃなくてidenticalってなってる.identicalって,「同一の」とかいう意味だけど*1,コレで良いのか.まぁ実際,動いてるから良いか?これが,「バージョンによる違い」ってやつなか.


それじゃ今日はコレぐらいで.

*1:ALC調べ