この記事の目的
パソコンで食っていきたいと思い立ってRubyの勉強をしている。いきなりRailsやるなっていうのは腐るほど言われてるのでSinatraから始めている。
ドットインストールとか入門Sinatra
軽く勉強した上で自分で何か作ってみたいと思い、じゃんけんしてみた。
上述の入門Sinatraでもじゃんけんアプリはやっていたのだが、GETメソッドでurlで出す手を指定して、paramsでクエリ文字列を取得して〜〜という感じだった。
けど、たかがじゃんけんするのにurlどうこうとかはめんどくさいなと思い、ボタンを押したら結果が出るような形にしたかった。
コード
ディレクトの構造はこんな感じ
.
├── janken.rb
└── views/
├── index.erb
├── layout.erb
└── result.erb
layout.erbは大したアレじゃないので省略する。
index.erb
<h2>何を出しますか?</h2>
<form action="/result" method="post">
<button type="submit" name="throw" value="rock">ぐー</button>
<button type="submit" name="throw" value="sissors">ちょき</button>
<button type="submit" name="throw" value="paper">ぱー</button>
</form>
出す手のbuttonをクリックすると、result.erbに何を出したのかがPOSTされるようにした
janken.rb
require 'sinatra'
require 'sinatra/reloader'
get '/' do
@title = "janken"
erb :index
end
post '/result' do
@title = "result"
@throw = params["throw"].to_sym
@defeat ={rock: :scissors,scissors: :paper, paper: :rock}
@computer_throw = @defeat.keys.sample
erb :result
end
- index.erbからPOSTされたvalue属性を受け取ってプレイヤーの手を決める
- 勝敗を決める相関図をハッシュで作成
- 上で作ったハッシュのきーをランダムで抽出することで、コンピュータが出す手を決める
- result.erbを表示する
result.erb
<h2>
<% if @throw == @computer_throw %>
Tied
<% elsif @throw == @defeat[@computer_throw] %>
You won
<% else %>
You lost
<% end %>
</h2>
You : <%= @throw %> <br>
Computer: <%= @computer_throw %>
<br>
<a href="/">again!</a>
勝利条件は以下のようにした。
@defeat
から@computer_throw
(相手の出す手)で抽出した値が、@throw
(自分が出した手)と同じならば勝ち
終わりに
index.erbからポストされた値を取得するのに手間取った。
出来上がってしまった今だと、何をそんなに手間取っていたのかもわからないのだが、@throw
が全然うまく行かなかった。
ターミナルのロゴを見たらなぜ想定通りの動きをしていないのかはヒントが落ちていたし、ログ見るって大事なんだなと。
結局なにがダメって、HTTPとかの知識が皆無でログも何が起きてるのかわからなかったのが問題。
Webを支える技術を読んでぼんやりとでも知識をつけられたおかげ化。知識が0と1じゃ大違いだ、
何はともあれ、自分で考えて作ったものが、想定通りに動かせた。嬉しい。