2008年11月24日月曜日

第13.8回Grailsコードリーディング(その3) Grails本気の入門~2時間でいけるところまでライブコーディング!?をまとめてみました



と、こんな感じでふとお客さんを見ると、多分「?」です。自分の仕事にはまだ合致していない模様です。
だいたい、「Company:1」って、まずそこで違和感ありますよね。なので、ドメインクラスにちょっと細工します。多分、これは最初からやっておいた方がいいと思います。

22.ID表記されているところを見やすくしてみます。
それぞれのドメインクラスに下記のように追記します。
Item.groovy

class Item {

static belongsTo = [company:Company]

String name
String spec
Long price
Date release

static constraints = {
name(blank:false)
spec(maxSize:4000)
price(max:10000L)
company()
release()
}
String toString(){ //ここから追記
return name
}
}

Company.groovy

class Company {

static hasMany = [items:Item]

String name
String note

static constraints = {
name(blank:false)
note(maxSize:4000)
}

String toString(){ //ここから追記
return name
}
}

toString()を使って、そのままnameを返す、ということをしています。
こうすると、下記のように、ちゃんと名前を返してくれるようになります。returnのところには、Groovyで色々かけるので、計算させたりとかもOKです。ドメインクラスとして持たせておいた方がよいものは、ここでやってしまうのも手です。
・商品を登録するところ(セレクタに「ニューキャスト」と出ている)


・商品情報を表示したところ(companyのところに…)


・製造元情報を表示したところ(Add Itemのところに「南天のどあめ」と出ている)




これでなんとなく「へー」から「なるほどね」と、ちょっとお客さんとプログラマが近づいた感が出るかもしれません。
ここで、もう一発、ぐっと近づけるために、フィールド名を日本語で表記させてみます。

23.i18n-templatesを使って、日本語表記にしてみる。
ですが、ここはなんとGCR当日に偶然にも上原さんが書いていたので、そっちを参考にしてください。
■[Grails]好きなGrailsプラグインシリーズその1 i18n-templates
★ちなみに、僕のは今Grails自体が1.0.3なので、grails install-plugin i18n-templateをしたときに、1.0.4を拾ってきてしまいます。そうすると、例えばcreateを開くと、create.jpsとか無いよ、って言われましたので、前に拾っていた1.0.3のPluginを入れると正常に動作しました。途中でPluginを入れ替えたけど特に問題ないのはなぜ?
ちなみに、今回の表記を変更したものはこんな感じです。
grails generate-i18n-messages item及びcompanyで吐きだしてくれたもの

home=Home
create=Create
edit=Edit
update=Update
delete=Delete
delete.confirm=Are you sure?

# Item messages
item.create=Create Item
item.edit=Edit Item
item.list=Item List
item.new=New Item
item.show=Show Item
item.created=Item {0} created
item.updated=Item {0} updated
item.deleted=Item {0} deleted
item.not.found=Item not found with id {0}
item.id=Id
item.name=Name
item.name.blank.error=Property [Name] of class [Item] cannot be blank
item.name.nullable.error=Property [Name] of class [Item] cannot be null
item.spec=Spec
item.spec.maxSize.error=Property [Spec] of class [Item] with value [{2}] exceeds the maximum size of [{3}]
item.spec.nullable.error=Property [Spec] of class [Item] cannot be null
item.price=Price
item.price.max.error=Property [Price] of class [Item] with value [{2}] exceeds maximum value [{3}]
item.price.nullable.error=Property [Price] of class [Item] cannot be null
item.company=Company
item.company.nullable.error=Property [Company] of class [Item] cannot be null
item.release=Release
item.release.nullable.error=Property [Release] of class [Item] cannot be null

# Company messages
company.create=Create Company
company.edit=Edit Company
company.list=Company List
company.new=New Company
company.show=Show Company
company.created=Company {0} created
company.updated=Company {0} updated
company.deleted=Company {0} deleted
company.not.found=Company not found with id {0}
company.id=Id
company.name=Name
company.name.blank.error=Property [Name] of class [Company] cannot be blank
company.name.nullable.error=Property [Name] of class [Company] cannot be null
company.note=Note
company.note.maxSize.error=Property [Note] of class [Company] with value [{2}] exceeds the maximum size of [{3}]
company.note.nullable.error=Property [Note] of class [Company] cannot be null
company.items=Items
company.items.nullable.error=Property [Items] of class [Company] cannot be null

書き換えたもの

home=Home
create=追加
edit=編集
update=更新
delete=削除
delete.confirm=本当に消しちゃうの?

# Item messages
item.create=商品の新規登録
item.edit=商品情報の編集
item.list=商品リスト
item.new=新規登録
item.show=商品情報の表示
item.created=商品 {0} を新規登録しました!
item.updated=商品 {0} を更新しました!
item.deleted=商品 {0} を削除しました…
item.not.found=商品ID {0} は見つからないぞもし
item.id=Id
item.name=商品名
item.name.blank.error=商品名は入れてくれないと登録できませんよ。
item.name.nullable.error=商品名は入れてくれないと登録できませんよ。
item.spec=詳細情報
item.spec.maxSize.error=ゴメン…詳細情報は、4000バイト以上は入れられないんだ…
item.spec.nullable.error=詳細情報入れてよ
item.price=価格
item.price.max.error=価格は、10001円以上は、入れちゃダメなんだ…
item.price.nullable.error=価格はいれなきゃダメなんだよ。
item.company=製造元
item.company.nullable.error=製造元はどこですか?無いわけ無いでしょ!
item.release=発売日
item.release.nullable.error=発売日はちゃんと入れてよね…もう…聞いてんの!
# Company messages
company.create=製造元の新規登録
company.edit=製造元情報の編集
company.list=製造元リスト
company.new=製造元の新規登録
company.show=製造元情報の表示
company.created=製造元 {0} を新規登録しました!
company.updated=製造元 {0} を更新しました!
company.deleted=製造元 {0} を削除しました…知らないよ…
company.not.found=製造元ID {0}?しらねえな…
company.id=Id
company.name=会社名
company.name.blank.error=会社名なしは、あり得ん!
company.name.nullable.error=会社名なしは、あり得ん!
company.note=備考
company.note.maxSize.error=ゴメン…言ってなかったかな。詳細情報は4000バイト以上は入らないんだよ…
company.note.nullable.error=詳細情報は入れてよね。
company.items=製造商品
company.items.nullable.error=商品がないけどいいの?よくないでしょ…

そうすると、下記のように日本語になってくれます。
上原さんも書かれてますが、僕はプロトタイピングのところで、お客さんのイメージできるものを作りたいので、とても重宝しています。そしてgenerate-allとかでViewを吐いた後も、使い続ければ、用語統一がしやすいです。
そうすると、こんな感じです。とりあえず商品登録で、バリデーションエラーを発生させてみました。

出来る限り柔らかくメッセージを書いたつもりでしたが、数行に渡って連発で怒られると、ちょっとヘコみます。気をつけましょう。



と、やっと、この辺でぐっと、また距離が近づくかもですね。

24.「あ、今更だけど、型番入れないといかんわ、ゴメン」
そうですね、そういうのにも対応してあげましょう。
じゃないと、ライブコーディングの意味ないですよね。
型番は大事なので、必須にしておきます。
Item.groovy

class Item {

static belongsTo = [company:Company]

String name
String modelNumber //追加
String spec
Long price
Date release

static constraints = {
name(blank:false)
modelNumber(blank:false) //追加
spec(maxSize:4000)
price(max:10000L)
company()
release()
}
String toString(){
return name + "(${modelNumber})" //ちょっと変更。商品名(型番)で表記されるように。
}
}




追加変更も簡単にできるんだ、と思わせつつ、本当は、この辺がGCRでも盛り上がりましたが、RoRのようなmigrateの機能がないというところ。ずーっと使い続けるには、上記のようにフィールドの変更があり得るので、そういったバージョンアップのときに、migrationして整合性を調整しつつ、永続的に使用できるようになってるといいのに、という話がありました。確かにそうなんだけどなあ、でも、大将山田さんも山本君もやろうと思えばできるでしょうね、って言ってたので、できるんだろうな。前のGroovyコンファレンスの後でもそういう話あったんだよなあ。実際どうなんだろうな。確かにインデックスの再構築とかいろいろあるんでしょうね。

と、一応こんな感じで、表示されます。ちょっと分かりやすいですね。


modelNumderというフィールドを追加したので、手動でi18n-templateのファイルに書き込んでもいいですが、もう一回、grails generate-i18n-messages itemをして、差分だけコピペして入れてもいいと思います。

その4へ続く

0 件のコメント: