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!")とか順番にやってると考えれば当然のことか。納得した。

0 件のコメント: