Play Framework を始めたばかりの方向けに、サンプルを進めるうえで困ったところを共有する目的で書いています。
Play Framework 2.8.x のScala 用フォーム入力サンプルに、 都道府県を選択するメニューを追加したときのメモです。
以下、目次
html テンプレートで使用するローカル変数は、定義と参照は同じブロック内にする
select 要素のoption 属性に都道府県の一覧を指定する際に、Map[String, String] で渡す必要があった。
都道府県一覧をMap[Int, String] で定義していたので、Int -> String に変換するためにローカル変数を定義しoption 属性に指定した。
/app/views/listWidgets.scala.html
@* ローカル変数は、定義と参照は同じブロック内にする *@ @{ val prefectureMenu: ListMap[String, String] = views.Prefecture.allPrefecture.map{ case (key, value) => (key.toString, value) } helper.select(form("prefecture"), options = helper.options(prefectureMenu)) }
都道府県の一覧をどのように実装するのがいいか、調べても出てこない(Scala だと)
都道府県一覧をMap[Int, String] で定義したのは、
手っ取り早くコピぺしたくて検索して出てきたもの(1, 北海道 みたいな)を使ったため。
ただ、実際に使うまでに以下のようなことを(結構)考えた。
- こういう一覧(enum ?)ってScala でどう記述するのか?
- どう記述すれば、拡張(データベースに保存、都道府県チェック等)するときに困らない?
- 今は一覧がMap で欲しいだけど、よく考えたら一覧から要素を取得する方が多くなる?
- 各都道府県を定義して、一覧は作成させる形がいい?
検索したらScala の主流みたいのがあるかな?と思ったけど、私は結局見つけられませんでした。
ので、結果以下のような形に。
/app/views/Prefecture.scala
package views import scala.collection.immutable.ListMap object Prefecture { val allPrefecture: ListMap[Int, String] = ListMap( 1 -> "北海道", 2 -> "青森県", 3 -> "岩手県", 4 -> "宮城県", 5 -> "秋田県", 6 -> "山形県", 7 -> "福島県", 8 -> "茨城県", 9 -> "栃木県", 10 -> "群馬県", 11 -> "埼玉県", 12 -> "千葉県", 13 -> "東京都", 14 -> "神奈川県", 15 -> "新潟県", 16 -> "富山県", 17 -> "石川県", 18 -> "福井県", 19 -> "山梨県", 20 -> "長野県", 21 -> "岐阜県", 22 -> "静岡県", 23 -> "愛知県", 24 -> "三重県", 25 -> "滋賀県", 26 -> "京都府", 27 -> "大阪府", 28 -> "兵庫県", 29 -> "奈良県", 30 -> "和歌山県", 31 -> "鳥取県", 32 -> "島根県", 33 -> "岡山県", 34 -> "広島県", 35 -> "山口県", 36 -> "徳島県", 37 -> "香川県", 38 -> "愛媛県", 39 -> "高知県", 40 -> "福岡県", 41 -> "佐賀県", 42 -> "長崎県", 43 -> "熊本県", 44 -> "大分県", 45 -> "宮崎県", 46 -> "鹿児島県", 47 -> "沖縄県" ) }
追加してみて
以下の点が気になるので、調べようと思う。
- select のvalue がInt だからか、Minimum value: 1 Maximum value: 47 Numericが表示される(したくない)
- メッセージが英語!!(日本語にしたい)
- form ってセキュリティに気を付けないといけないらしいけど、今はデフォルト設定だよ(大丈夫なのか)
- 都道府県の入力(選択?)チェック入れてない(変な値をいれてPOST したらどうなる)
Heroku 公開はこちら
以上でした。