Ruby on RailsでLINE Bot② はじめてのリファクタリング
6/16 Rails Girls Tokyo, More!に初めて参加してきました🎈
Rails Girls Tokyo, More!とは、Rails Girls Tokyoの卒業生向けの勉強会です!本家と同じく、コーチにRubyやRailsなどなどを教わることができます。Rails Girlsでつくったアプリの続きをやることもできますし、自分でやりたいことを持っていってコーチに質問することもできます!ありがたい場です🙏🙏🙏🙏🙏
Rails Girls Tokyo 9th の記事→Rails Girls Tokyo 9th に参加しました - kasumi∞blog
ということで、私は作成中のLINE Botもっていきました。
LINE Botの現状
- herokuで動いている。
- ユーザーが投稿したメッセージに対して条件が合えば簡単な返信をする。
(例: "おはよう"→「おはよう!」) - 迷っていることをBotに決めてもらえる機能などがある。
(例: "A B どっちにしよう?" →「Aにしよう!」または「Bにしよう!」) - ちゃんと動くし楽しく使っているけれど、なんだかコードが読みにくい。。。😖
問題と感じていること
- controllerにこんなに長々と処理を書いてるけど、これ絶対ここに書くものじゃない気がする……🙁どこに書けばいいんだろう?🤔🤔🤔
- ここのコード、簡単な処理なのにこんなにコードが長い……😞絶対にもっと短く読みやすくできるでしょ!でもどう書けばいいんだろう?🤔🤔🤔
やったこと・学んだこと
- Controllerの処理のうち、返信を生成する処理をModelに移しました。
- 1つ1つの処理の無駄な部分(returnや不要な変数への代入)、読みにくい部分をわかりやすく変更しました。
(このようにコードを整理することを"リファクタリング"という!)
Controllerについて
ControllerはModelとviewの仲介などデータの受け渡しをするところであるため、LINE Botでいう返信の生成の処理などは普通Controllerには書かないとのこと。
では、なぜ私はControllerにいろんな処理を書いていたのかというと、どこに書けばよいのかわからなかったからでした。(LINE BotにViewは必要ないし、Modelってデータベースつくるときにできたファイルだったような?返信は別にデータベースには格納しないし……。でもControllerに書くのはなんいか変だなあ。)
しかし、Modelはデータベースに格納するデータじゃなくても構わないのですね😳
返信を生成するメソッドを、Modelでdef self.make_reply
で定義し、Controllerからは、クラス名.make_reply
で呼び出しました。
(また、class << self
end
の中でメソッドを定義すれば、いちいちすべてのメソッドにself.をつけなくてもクラスメソッドとして定義できる!)
ほかにもたくさん
その他、知らないこと・自分一人では気づけないことをたくさん教えていただきました!
- スネークケースとキャメルケースの使い方
- ActiveModelについて
- メソッドの命名方法(略称は誤解を生むので避けた方が良い)
- KVSについて(Key-Value Store)
- class Struct(構造体クラス)
- 三項演算子(画面上に連なる長々if文がすっきり😂)
- decoratorについて(Modelの情報を少しだけ加工してViewに表示させたいときなどに使える!)
- cloudinaryの便利な使い方
- GoogleChromeの右クリック→検証
- WebAPIについて
感想
今回もすべてが学びの時間で、本当に有意義で楽しかったです。
○○がやりたい!と思ったときって、検索するとだいたいこうやってやりましたという記事が出てきて、その通りやれば結構できちゃう。でも、なんかおかしいなあ〜?何がおかしいんだろう、どうすればいいんだろう?ってときは検索して自分で解決するのが難しいので、このように相談させていただける環境は本当に有り難いです。ありがとうございます🙏🙏🙏
クラスメソッドについては言葉は本で読んで知っていたけれど、どのようなときに使うべきかまで理解できていませんでした。実際使って見たので、もう一回読み返してみます!
ぼんやりとしたテーマですが、自分でやりたいことを決めて持っていったのがよかったかなと思います。(今回は"つくったLINE Botのコードがなんかわかりにくいので直したい!") もちろん何をすればいいのかわからなくてもコーチに相談に乗っていただけますが、自分でなんとなくやりたいことがあると、それができたときとても達成感があってよいかなと思いました🌸
まだまだ追加していきたいBotの機能があるので、引き続き頑張っていきます!💪