
PHPerがRailsを使わないRubyで掲示板API組んでみた
この記事で語ること
自己紹介
何を作ったか
使用したGemについて
使用しなかったGemについて
PHPとのRubyの比較
感想
俺と同じように、PHPなどの他の言語からRubyの世界に入門したいと思っている人に、Rubyの世界をなんとなく伝えられたらいいかなと思ってます。特にネイティブRuby開発の記事はRailsの記事と比較すると圧倒的に少なかったので、Railsに頼らない開発をしたい人たちの一助になれば嬉しいです。君も一緒に裸のRubyを書こう!
自己紹介
「ちょらん」といいます(Twitter: https://x.com/choran_gang)。客先常駐の会社でLaravelを使って労働しているバックエンダーです。最近はDDDなど、主にバックエンドのアーキテクチャに興味があって勉強中です。
成果物について
こちら。RubyBBDDDと名付けました。
RubyBBDDDはRubyの言語仕様とDDD(ドメイン駆動設計)などの設計思想の勉強のために書きました。LaravelやRailsなどのフレームワークに依っていないのは、EloquentModelやActiveRecordの吸引力が凄すぎて、DDDのようなリポジトリパターンが採用しづらいからです。
以下、前作。
これ書いてたのが二ヶ月前くらいですが、この頃よりも設計思想についての知見は溜まっている気がしています。
使用したGem
ざっくり、PHPでいうところのComposerがGem。このへんのツールを選んでいる時間がRubyの世界を知るのに役に立ったと感じました。
Puma
Httpサーバ。界隈の人なら全員知ってるRuby on Railsがデフォルトで使うもの。PHPだと組み込みのスーパーグローバル変数があるので値を受け取るところをあんまり意識しなかった記憶なんだが、Rubyの場合はリクエストの受け取るまでにちょっと作業がある。これ以外にもHttpサーバとしてはWEBRick,Unicorn,Falconなどの選択肢があるらしいが、「あのRailsが使っているならいいに決まっているだろう」とよく考えず採用した。いろいろ見た感じだとWEBRickが、後述のRackと合わせて、今回のような1からの趣味コーディングに適していたかも。結局今回の開発で凄みを感じることはあまりなかった。スレッドが云々とか、サーバのアーキテクチャの話がある程度わかると適切な技術選定ができるのだと思う。
Pumaについていくつか記事。実はまだ読んでいない。 Ruby:PumaとWEBRickの比較 https://polishruby.com/95/ruby-pumaとwebrickの比較/
Pumaについて深掘りしてみた https://qiita.com/yusuke2310/items/1695cd702cdf25d34fbc
Rack
Rubyフレームワークの標準的な機能を提供してくれるライブラリ。Rubyでフレームワークといえばこれ、らしい。Rubyフレームワーク界で圧倒的シェアのRailsがベースとして使っている他、Sinatra,HanamiなどもRackの上にあるらしい。ちなみに、Pythonの世界だとWSGIがかなり近い立ち位置にいる模様。以下の『Rackとは何か』(全3回)がとても詳しくて役に立った。
Rackとは何か
https://gihyo.jp/dev/serial/01/ruby/0023
RailsとRack(Rails公式)
https://railsguides.jp/rails_on_rack.html
Rackとは何か(Qiita) https://qiita.com/k0kubun/items/248395f68164b52aec4a
Guard/Guard-Puma
制作中にコードがコンテナに自動反映されなくて調べたらこれに突き当たり、これとRack.Reloaderを入れたら自動反映されるようになったので、もしかしたらRuby界隈では入れるのが当たり前のツールなのかなと思ったり。これを入れてGuardFileというのをルートに作成して使う。全く全体像を知らずに使っている。以下の記事のように使うらしいけど、Installしたのがだいぶ前なのと、よく調べずに入れたら自動反映問題が解決しちゃったのでマジで何もわかっていない。なにこれ。
Ruby | Guard gem を利用してファイルの変更を検出し、任意のタスクを自動実行する https://qiita.com/tbpgr/items/f5be21d8e19dd852d9b7
pg
PostgreSQLと繋ぐためのGem。最初mysql2というGemを使っていたのだが、Sockerファイルがないよ〜というエラーがどうあがいても解決できなかったので乗り換えた。結果的にこっちの方が快適だった。
公式リポジトリ
https://github.com/ged/ruby-pg
dotenv,jwt,bcrypt
順に、ENVファイルの情報を読み込みたい時に使うもの、認証機能にJWTを使いたい時に使うもの、ハッシュ化したいときに使うもの。PHPで使う場合とあまり変わらない。
それぞれの公式リポジトリ。
https://github.com/bkeepers/dotenv
https://github.com/jwt/ruby-jwt
https://github.com/bcrypt-ruby/bcrypt-ruby
使わなかったGem
入れようとして使いこなせなかったり、しっくりこなかったり、時間がないと思ってやめたりしたもの。
Roda
ルーティング用。あんまり見ないタイプの書き方をさせる。入れようとしてちょっと使ったけど、GPTにRouterの実装を吐かせた方が早かったので不採用とした。
Roda公式。書き方がおもしろい。
https://roda.jeremyevans.net/
mysql2
pgのとこで書いたけど、エラーに敗北して逃げた。
RSpec
テスト用のそれ。確かRubyは標準でMinitestっていうライブラリがあるんだが、RailsでRSpecが使えるみたいな噂を聞いて使ってみた。書き方としてはPestとかJestに近いのかなと感じた。DDD的に書いたのでテストもやってみようと思ってたが、全部やっていると時間が倍かかりそうでやめた。Rails触るときはちゃんと触ってみたい。
pry
デバッグツール。一度入れた。binding.pryで対話的にデバックができるという優れものらしいが、Binding,pryに反応してくれなかったので心が折れてやめてしまった。Railsではちゃんと使ってみたい。
debug
見るからにデバッグツールな名前のデバッグツール。比較的新しめのツールなよう。これでDebugしてみると都度Serverが止まっちゃってやめた。たぶん設定のところをちゃんとやれば強力なツールになりうる。Rubiest的にはpryが支配的な感じするけど、Rails触る時ついでにちょっと触ってみたい。
PHPと比べたRubyの良いとこ悪いとこ
良いところ
圧倒的に記述がシンプル。書き味◎。
クラス書きやすい。attr_accessor+変数名でgetter,setterの記述がいらなくなる。
書き方の選択肢が多い。unlessとか後置ifとかNilガードとか好き。
悪いところ
Interfaceクラスがない。なんで?
ライブラリ増えがち。スーパーグローバル変数、PDOにマジで感謝。
一番はこれ。日本語の情報がほぼない。検索したらほとんどRailsの情報だった。俺みたいに裸のRubyで書きたかったやつはほぼいなかったらしい。
VSCodeで書くとPHPの方が便利?クラスを指定したらRequireを勝手に保管して欲しい。namespace万歳。
感想
とにかくRubyは書き味がよくて書いていて楽しかったです。余計なものが削ぎ落とされていて宝石のように美しかった。言語仕様としても普段書いているPHPとの距離はかなり近めでした。Interfaceクラスがないのが本当に謎。