sudo -u grails

Grailsの記事が充実する。といいなぁ

一部で話題のIKEAorDEATHをGrailsのコントローラだけで作ってみた

http://ikeaordeath.com/ というサイト、ご存知ですか?IKEAで販売されてるアイテムとデスメタルバンドのバンド名、何がどっちかの2択を出してるサイトです。

ここを見てて、Grailsのコントローラだけでもこういう動きするページ作れそうだな、と思って作ってみました。Grailscreate-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にも置いてあるので、見づらい方はそちらを見てください。

リスト ikeasmetals はそれぞれイケア、メタルの出題リストです。 totalcorrect はそれぞれ出題総数と正解数ですね。コントローラだけで作るために、staticにしています。

アクション index は出題画面で、イケアの場合は ikea アクションに、メタルの場合は metal アクションに飛ばします。このとき、 id に選択した要素の文字列を入れておき、飛んだ先のアクションで params.id で拾えるようにしておきます。

アクション metalikea はそれぞれ正解の判定をするアクションで、三項演算子 ? を使って判定しています。 ++correct するためにHTMLのコメントを使ったり、ちょっと無理やりですね。 index アクションから飛ばすパラメータを増やせば metal アクションと ikea アクションは分ける必要も無くなるので、気になる方はちょっと考えてみてください。

こんな風に、Grailsはちょっとしたお遊びプログラムを走らせるWebアプリケーションフレームワークとして使うこともできるんですよ!