今回はまたまたRubyの話。Rubyと言ってもWebのフレームワークであるRuby on railsであつかっているRubyのお話です。
私が今回やりたかったのは、結構前に書いたAPIに関連して、APIを叩く関数に渡す引数の値によって、クエリストリングを分岐させたかったというわけです。例えば、0という引数を渡すと今日のアクセス数、1を渡すと訪問者数、2を渡すと月のアクセス数、といった具合にです。
If文で分岐できない!?
私が書いたコードが以下のような感じです。一部抜粋ですが、if文を使って分岐していることがわかると思います。
def get_data d = Date.today if @data==0 @client.execute( api_method: api.data.ga.get, parameters: { "ids" => "ga:"+@id, "start-date" => "today", "end-date" => "today", "metrics" => "ga:pageviews", "dimensions" => "ga:year,ga:month,ga:day", "sort" => "ga:year,ga:month,ga:day" } ) elseif @data==1 @client.execute( api_method: api.data.ga.get, parameters: { "ids" => "ga:"+@id, "start-date" => "7daysAgo", "end-date" => "today", "metrics" => "ga:pageviews", "dimensions" => "ga:year,ga:month,ga:day", "sort" => "ga:year,ga:month,ga:day" } ) end end
@dataには分岐条件の引数が入っています。0の時と1の時でifとelseifを使い分岐をしているというわけです。一見間違いがないように見えますが、これではうまく分岐されず、エラーも出たり出なかったり、なんだかよくわからないことになって2時間くらいはまってしまいました。
CやPython、Javaをやっていた人は特に注意
うまくいかない理由は、構文にありました。他のプログラミング言語をがっつりやっていたので、Rubyのif文も構文は一緒だろうと思い込んでいたのが間違いでした。
Rubyで分岐を書きたいときは、以下のように書くのが正解です。
if @data==0 ・・・・・ elseif @data==1 ・・・・・ end
ぱっと見違いがわからないかもしれませんが、最初に書いていた私の分岐では、エルスイフの部分を「elseif」と書いているにに対し、正しい書き方は「elsif」なのです。そう。「e」が一ついらないようになっているのです。
これはRuby独特の描き方らしいのですが、細かいがゆえになかなか気づけず大変でした。同じような人がいたら確認してみてください。
まとめ
今回はif文でハマってしまった体験談でした。今後はリファレンスの細かいところにも注意して読みたいと思います。