一部で話題のIKEAorDEATHをGrailsのコントローラだけで作ってみた
http://ikeaordeath.com/ というサイト、ご存知ですか?IKEAで販売されてるアイテムとデスメタルバンドのバンド名、何がどっちかの2択を出してるサイトです。
ここを見てて、Grailsのコントローラだけでもこういう動きするページ作れそうだな、と思って作ってみました。Grailsで create-controller
して、こんなコードを。
package ikeametal class QuestionController { List ikeas = ["Vittsjö","Klubbo","Bastig","Boholmen","Grundtal","Dåtid","Samsplet","Skogaby","Adde","Nyvoll","Strandmon","Krokig","Vyssa Skont","Melltorp","Vridvinge"] List metals = ["Akercocke","Einherjer","Sargeist","Taake","Ensiferum","Midnattsol","Turisas","Thaurorod","Sikth","Eluveitie","Månegarm","Kovenant","Korpiklaani"] Random rand = new Random() static Integer total = 0 static Integer correct = 0 def index() { List joined = metals + ikeas def picked = joined[ rand.nextInt(joined.size()) ] render "<H1>$picked</H1> is IKEA or METAL ?" + g.link(action:"ikea",id:picked){"<H2>IKEA</H2>"} + g.link(action:"metal",id:picked){"<H2>METAL</H2>"} + "( $correct / $total )" } def metal() { total ++ def ans = metals.contains(params.id) ? "<H1>Right!</H1> ${params.id} is Metal Band.<!--${++correct}-->" : "<H1>Wrong.</H1> ${params.id} is IKEA Item." ans += g.link(action:"index"){"<H2>Next</H2>"}+"( $correct / $total )" render ans } def ikea() { total ++ def ans = ikeas.contains(params.id) ? "<H1>Right!</H1> ${params.id} is IKEA Item.<!--${++correct}-->" : "<H1>Wrong.</H1> ${params.id} is Metal Band." ans += g.link(action:"index"){"<H2>Next</H2>"}+"( $correct / $total )" render ans } }
Gistにも置いてあるので、見づらい方はそちらを見てください。
リスト ikeas
、 metals
はそれぞれイケア、メタルの出題リストです。 total
と correct
はそれぞれ出題総数と正解数ですね。コントローラだけで作るために、staticにしています。
アクション index
は出題画面で、イケアの場合は ikea
アクションに、メタルの場合は metal
アクションに飛ばします。このとき、 id
に選択した要素の文字列を入れておき、飛んだ先のアクションで params.id
で拾えるようにしておきます。
アクション metal
、 ikea
はそれぞれ正解の判定をするアクションで、三項演算子 ?
を使って判定しています。 ++correct
するためにHTMLのコメントを使ったり、ちょっと無理やりですね。 index
アクションから飛ばすパラメータを増やせば metal
アクションと ikea
アクションは分ける必要も無くなるので、気になる方はちょっと考えてみてください。
こんな風に、Grailsはちょっとしたお遊びプログラムを走らせるWebアプリケーションフレームワークとして使うこともできるんですよ!