はじめに
前回の教科書で、オウム返し Bot を作ることができました。
しかし、まだ何を送っても同じ言葉が返ってきてしまい、会話をしているように感じられません。そこで、今回は上の画像のように、送ったメッセージによって返す文章を変えられるようにしていきましょう。
返す文章が変わる仕組みを理解しよう
送るメッセージと返す文章を紐付けることによって、メッセージによって違う文章を返すことができます。
今回であれば、バラというメッセージに対して花言葉は「愛情」だよという文章を、チューリップというメッセージに対して花言葉は「思いやり」だよという文章を、ひまわりというメッセージに対して花言葉は「あなただけを見つめる」だよという文章を紐付けます。
また、何も紐付けていないメッセージに対して返す文章も、設定します。
メッセージによって返す文章を変えれるようにしよう
バラの返事を作ろう
それでは、実際に送るメッセージによって返す文章を変えます。
今回は、花の名前を送るとその花言葉が返ってくるようにします。花言葉については、前の画像にもあったこちらの表を参考にします。
さっそく、バラの花言葉から作ります。
app.rbを開いて、以下のコードと同じ箇所を見つけましょう。
post '/callback' do
body = request.body.read
signature = request.env['HTTP_X_LINE_SIGNATURE']
unless client.validate_signature(body, signature)
logger.warn("400")
error 400 do 'Bad Request' end
end
events = client.parse_events_from(body)
events.each do |event|
message = {
type: 'text',
text: event.message['text']
}
client.reply_message(event['replyToken'], message)
end
"OK"
end
バラと送ったら花言葉は「愛情」だよと返すように、以下のようにハイライトの部分のコードを書き換えます。
post '/callback' do
body = request.body.read
signature = request.env['HTTP_X_LINE_SIGNATURE']
unless client.validate_signature(body, signature)
logger.warn("400")
error 400 do 'Bad Request' end
end
events = client.parse_events_from(body)
events.each do |event|
if event.message['text'] == 'バラ'
message = {
type: 'text',
text: '花言葉は「愛情」だよ'
}
else
message = {
type: 'text',
text: 'その花は知らないよ'
}
end
client.reply_message(event['replyToken'], message)
end
"OK"
end
動作を確認しよう
ターミナルに次のコマンドを入力してサーバーを起動します。
ruby app.rb

if-else文を理解しよう
if event.message['text'] == 'バラ'
message = {
type: 'text',
text: '花言葉は「愛情」だよ'
}
else
message = {
type: 'text',
text: 'その花は知らないよ'
}
end
今コードを書き換えた部分は、if文を使って、もし送った文章event.message['text']がバラであれば花言葉は「愛情」だよという文章を返し、それ以外(else)であればその花は知らないよという文章を返すように、条件分岐しています。
条件式には==が使われているけど、これはプログラミングにおいては等しいという意味を表します。
if文とは
条件によって場合分けし、それぞれに違う処理を実行したい時に用いるのが、if文(条件分岐)です。
今回であれば、上の図のように条件分岐をすることによって、バラというメッセージに指定の文章を紐付けることができます。
if文は多くのプログラミング言語で用意されており、とても便利な仕組みなので、是非覚えましょう。
Rubyで条件分岐
if 条件式
# 条件式を満たした時に実行するコード
else
# 条件式を満たさなかった時に実行するコード
end
Rubyで条件分岐をしたい時には、ifの隣に一つスペースを空けて条件式を書きます。この条件式には、主に関係演算子<,>,==,=!などを使います。
もし条件式が満たされる時(true)ならば条件式を満たした時に実行するコードが実行されます。
満たされなければ(false)、条件式を満たさなかった時に実行するコードが実行されます。
必要がなければ、elseは書かなくても構いません。この場合、条件が満たされなければ、if文の次のコードが実行されます。
if文の具体例
ここでは、if文(条件分岐)を使ってプログラムの実行内容を変化させる具体例を見ていこう!Executeボタンをクリックすると実行されるよ!
以下のコードは実際に編集する事ができます。"バラ" == "バラ"から"チューリップ" == "バラ"にしてその花は知らないよと出力させよう。
(初回実行時は結果出力するまで10秒ほど時間がかかります)
Ruby Playground
初回実行時のみ、出力までに10秒ほどかかります。
返事をたくさん作ろう
app.rbにコードを打ち込もう
文章が返ってくるメッセージがバラだけではつまらないので、返事をたくさん作りましょう。まずは、上の表にも載っている、チューリップとひまわりの花言葉も返せるようにします。
先ほどと同じeach文の中に、新しくハイライトになっている部分のコードを追加していきます。

events.each do |event|
if event.message['text'] == 'バラ'
message = {
type: 'text',
text: '花言葉は「愛情」だよ'
}
elsif event.message['text'] == 'チューリップ'
message = {
type: 'text',
text: '花言葉は「思いやり」だよ'
}
elsif event.message['text'] == 'ひまわり'
message = {
type: 'text',
text: '花言葉は「あなただけを見つめる」だよ'
}
else
message = {
type: 'text',
text: 'その花は知らないよ'
}
end
client.reply_message(event['replyToken'], message)
end
花言葉が返ってくるか確認してみよう
バラ、チューリップ、ひまわりと打って正しい花言葉が返ってくるか確認してみましょう。
if-elsif-else文について理解しよう
if event.message['text'] == 'バラ'
message = {
type: 'text',
text: '花言葉は「愛情」だよ'
}
elsif event.message['text'] == 'チューリップ'
message = {
type: 'text',
text: '花言葉は「思いやり」だよ'
}
elsif event.message['text'] == 'ひまわり'
message = {
type: 'text',
text: '花言葉は「あなただけを見つめる」だよ'
}
else
message = {
type: 'text',
text: 'その花は知らないよ'
}
end
elsifは、ifを用いた条件式の後で、それ以前の条件式に当てはまらなかったものに対してさらに条件分岐を増やしたい時に用いられるものです。elsifを使えば、どんどん条件式を追加していくことができます。
条件分岐とは
条件によって場合分けし、それぞれに違う処理を実行したい時に用いるのが、if文(条件分岐)です。
今回であれば、上の図のように条件分岐をすることによって、それぞれのメッセージに指定の文章を紐付けることができます。

条件分岐の具体例
ここでは、if-elsif-else文を使ってプログラムの実行内容を変化させる具体例を見ていこう!Executeボタンをクリックすると実行されるよ!
以下のコードは実際に編集する事ができます。flower == "バラ"からflower == "ひまわり"にして花言葉は「あなただけを見つめる」だよと出力させよう。
(初回実行時は結果出力するまで10秒ほど時間がかかります)
Ruby Playground
初回実行時のみ、出力までに10秒ほどかかります。
メッセージによって返す文章を変える機能の完成
以上で、メッセージによって返す文章を変える機能の完成です。
この教科書を通じて、以下のことを学びました。
| 用語や内容 | 学んだこと |
|---|---|
| 返す文章が変わる仕組み | 送信されたメッセージと返信の文章を紐付けることによって、異なるメッセージに対して異なる返信を生成する仕組みを学びました。例えば、花の名前に応じて花言葉を返すようなプログラムを作成することができました。 |
| if文 | 条件分岐を行うための制御構造であり、ある条件が満たされているかを判断します。if文は「もし~ならば」という形式で記述され、条件式が満たされる場合に実行する処理を指定します。また、必要に応じてelse節を追加して、条件式が満たされない場合の処理を指定することもできます。 |
| elsif | if文において、最初の条件式が満たされない場合に、さらに別の条件を評価し、条件が満たされる場合に対応する処理を実行するための制御構造です。elsifは必要に応じて複数追加することができます。条件式が満たされる場合には最初にマッチしたelsif節の処理が実行され、それ以外の場合には次のelsif節の条件式が評価されます。 |
