2010年3月26日金曜日

datePickerでありえない日付を入力すると…

日付が繰り上がるのね。
内部でGregorianCalendar使ってるからかな…ヤな動きするなぁ。

message.propertiesでカスタムエラーメッセージを設定するとき

not null制約のエラーメッセージをカスタマイズしようとしたところ、上手くいかない。
ぐぬぬ、何故に…と思いきや、こういうことだったらしい。

registerInputクラスのaddressでnullable制約がひっかかったとき:
×registerInput.address.null=住所を選択してください。
○registerInput.address.nullable=住所を選択してください。

デフォルトのメッセージキーがdefault.null.messageだったから、てっきりnullかと思ってたよ…。
制約名がキーになるのね、納得した。
こんなしょうもないことで1時間以上も費やした罠…。

2010年3月21日日曜日

遅ればせながら、化物語を見始めた。

撫子可愛いよ撫子。
しばらくは恋愛サーキュレーションがヘビーローテになりそう。
とりあえずCD買ってこよう。

…ちなみにGrailsの方は特に書くことない状態。
というか、デフォルトのスタイルを書き換えようとcssをゴリゴリ書いてる状態。
こんなのは後にせよと…。

・追記
…と思って色々調べてたら、こんな記述を発見。
http://dic.nicovideo.jp/a/%E6%81%8B%E6%84%9B%E3%82%B5%E3%83%BC%E3%82%AD%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
フルバージョンのCDは市販されておらず、
化物語のDVDもしくはBlu-ray4巻の完全限定生産版のおまけでしか手に入らない。

何……だと……。
何というあざとい商法…や、とりあえずDVDポチっといたけど。

2010年3月18日木曜日

scaffoldのレイアウトをいじる際の注意

scaffoldの生成する動的なgspをいじるべなーってことで、「grails install-templates」して、gspにスタイルシートを仕込もうとしたところ、何故か404に。
はてな…と思い、コンソールを見ると、何故かException吐いてる。

2010-03-18 22:54:25,910 [http-8080-1] ERROR view.ScaffoldingViewResolver - Erro
r generating scaffolded view [/sex/create]: No signature of method: SimpleTempla
teScript5.resource() is applicable for argument types: (java.util.LinkedHashMap)
values: [[dir:css/all, file:scaffold.css]]
groovy.lang.MissingMethodException: No signature of method: SimpleTemplateScript
5.resource() is applicable for argument types: (java.util.LinkedHashMap) values:
[[dir:css/all, file:scaffold.css]]
at SimpleTemplateScript5.run(SimpleTemplateScript5.groovy:13)
at java.lang.Thread.run(Thread.java:619)


何か、css読ませるためにresource読んだらそこでコケたらしい。
色々調べてみたところ、こんな記事を発見。

Change scaffolding templates in Grails - Messages from mrhaki
http://mrhaki.blogspot.com/2009/07/change-scaffolding-templates-in-grails.html
何でも、scaffold用のgspを生成しているテンプレートエンジン内で、$を記号として使っているらしく、$を使うときは\でエスケープしてやる必要があるそうな。
そらわからんわ…。

てか、struts2のときもそうだったけど、この手の問題を解決しようとすると、どうしても英語のサイトに頼らざるを得なくなるなぁ…。

2010年3月17日水曜日

gspで現在のコントローラを取得したい場合

${webRequest.controllerName}で取得できた。…これでいいのかしらん?

しかし、gspのtaglib生成簡単すぎる…調子に乗って作りすぎる罠にでもハマりそうな勢いだ。
これ知ると他のフレームワークに戻れそうにないなぁ…。

2010年3月14日日曜日

Grails1.2.1でwebflowが使えない?

webflowを使ったcontrollerを作ってみようとして、試しに動かしてみたところ、何故か「そんなアクション定義されてねーよ」と404エラーで怒られる。
何か設定がマズいんだろうかと思って色々試してみるもNG。

それならば…と思い、参考にしているGrails徹底入門のサンプルソースを読み込ませてみると、それもNG。

サンプルで使っているGrailsのバージョンは1.0.3で、自分が使っているバージョンは1.2.1。
その間に何かしら仕様でも変わったんだろうかと思い、色々調べてみたところ、こんな記事を発見(というか、公式ページだけど)。

Grails - WebFlow
http://www.grails.org/WebFlow

Since of Grails 1.2 the WebFlow plugin is not installed by default (see GRAILS-5185).
Use 'grails install-plugin webflow' to install the plugin and enable this feature.


どうやら、現バージョンのGrailsではwebflowが最初からインストールされていないので、使いたければ自分で入れてねってことらしい。
プラグイン自体はインストールしたディレクトリにあるので、「grails install-plugin webflow」してやると無事動作。
現状で出てる解説書(自分が持ってるのはGrails徹底入門とはじめてのGrailsって本)だと書いてないので、微妙にハマりどころな気が…。

2010年3月12日金曜日

いきなり話は変わるけど

【ネタバレ】 荒唐無稽のルシッドドリーム 47
http://www.pixiv.net/member_illust.php?mode=medium&illust_id=9276918

pixivで連載されている荒唐無稽のルシッドドリームがオススメです(や、pixiv見てるシュタゲファンなら大概見てそうだけど)。
まゆしぃの不憫さに目頭が熱くなった。

そういえば

2/28の記事で書いたbody要素のアクセスで、bodyのoverflow要素をいじくると、何故かFireFoxでリロードされる件について。overflow要素ってFireFox対応してなかったっけ? それにしたって何故にリロード?
同じWebKit系でも、ChromeやSafari、Opera(OperaはWebkitじゃないか)では再現せず。何でやねん。

UnitTestでダイナミックメソッドを使う

DomainClassdでValidationのテストをやろうと思ったら、「んなメソッドねーよ」って怒られた。本じゃやってるのに! …と思ってよくよく見たら、UTじゃなくてITだった。
UTだとDomainClassでメソッドがInjectionされないらしい。うむむ、どうしたもんか。
…と思ったら、mockForConstraintsTestsというGrailsUnitTestCaseのメソッドで、そこら片のメソッドをInjectionしてくれるらしい。
ソースは↓。

Grails をマスターする: Grails によるモック・テスト
http://www.ibm.com/developerworks/jp/java/library/j-grails10209/

2010年3月11日木曜日

DomainClassで書き込みさせたくない項目を設定するには?

Grails をマスターする: Grails サービスと Google Maps
http://www.ibm.com/developerworks/jp/java/library/j-grails05208/

上の記事を見てて疑問に思ったこと。
AirportDomainClassの作成をページ上で行わせる際、iataとcity以外は触らせたくないため、gspをいじって編集できないようにしている。
「def airport = new Airport(params + results)」とあるので、params(POSTされたプロパティ)とresult(サーバ側で作られたプロパティ)をかけ合わせてbeanを作ってると思われる。
…ん? でもそれって、意図的に変なデータをPOSTすると(POSTパラメータ上でname指定したり)、結局値が上書きされちゃうんじゃ? それ、色々とヤバくね?

とか思って、しげしげとソースを眺めてみること数分。
あーこれ、足した順番で結果変わったりするのか? と思い立ったので、実験。

・Fooドメインクラスを作成、フィールドにbarを設定。
・grails generate-allでControllerとViewを作る。
・Controllerのsaveクロージャでsaveする前に以下の記述を追加。

def prop = [bar:"overwrite!"]

fooInstance.properties = params + prop

・上記の場合、保存時のbarは"overwrite!"になる(POST時のパラメータは無効)。

・↑の記述を以下に変更。

def prop = [bar:"overwrite!"]

fooInstance.properties = prop + params

・上記の場合は、保存時のbarはPOSTした値になる。

ようするに、addした順番でmapの内容が上書きされていってると判断。まあ、map.put("bar", "overwrite!")とか順番にやってると考えれば当然のことか。納得した。

grails始めました。

とりあえず、flex部分の作成が一区切り付いたので、アプリケーションのメイン部分をStruts2からgrailsへ移行すべく、色々調べながら始めてみることに。
とりあえずは本とかネットの記事とか見て、色々試してるところ。
確かにコードの記述量は減るけど、いかんせん慣れてないせいでどう進めていいものやらさっぱり。ひとまずは一画面分機能作ってみないことには何ともならんなぁ。