Railsのレールに乗っかってみる

スタディスト開発部、伴です。社会のレールに乗っかるのは大嫌いで、尾崎豊的な生き方をしてきました。(嘘です)

はじめに

現在スタディストではUIリニューアルを進めています。このプロジェクトを進めるにあたり、フロントサイドだけでなくサーバー側のコードを(一部)見直そうという話になりました。サーバーサイドのコードはRailsで開発しているのですがレールに乗り切れてない箇所があったりするのでこれを機会に書き換えてみることにしました。

以下よりRailsの思想に合わせて見直した内容を紹介します。

設定より規約

これはRailsの思想で「従来のフレームワークのように設定を大量に記述するのではなく、規約にのっとってプログラミングすることで、余計なプログラミングや設定を省くことができます。」ということです。

要は規約に従えば短くかけるということだと思います。見直し例を示します。

旧コードでは親子関係にあるレコードを作るとき Array idを受け取り一々確認しながら作成していました。

(例)

hoge_ids_array.each do |hoge_id|
oya = oyas.find_by(oya_id: hoge_id)
hoge = Hoge.find_by(id: hoge_id)
if oya.blank? && hoge.present?
Hoge.create!(oya_id: id, hoger_id: hoge_id)
add_hoges_result << { id: hoge_id, result: 'success' }
else
add_hoges_result << { id: hoge_id, result: 'failure' }
end
end

見直してRailsの機能accepts_nested_attributes_forを使って簡潔に書く様にしました。

accepts_nested_attributes_for :hoges, allow_destroy:
true, reject_if: :reject_hoge

どえらく、短くなりました。また、allow_destroyを入れて以前は別メソッドでやっていた削除も簡単に実現できる様になりました。

DRY(Don’t Repeat Yourself)

「同じことを繰り返さない」という考え方です。

見直し前は、status毎に処理を分岐しているロジックが散乱していました。

hoges.each do |hoge|
if hoge.status == 1
boke
elsif hoge.status == 2
kasu
elsif hoge.status == 3
kuzu
end
end

そこで、みんな大好き?ActiveRecordcallbackでstatus毎の処理をまとめてしまいました。

enum status: { draft: 10, gofu: 20 }
after_save :dokan, if: :draft?

しれーっとenum使ってますが、オブジェクトの状態(status)毎の処理をまとめてしまうことで状態毎の処理が明確になりました。status毎の状態の可視性が良くなりました。

REST(Representational State Transfer)

RESTfulなrouteにするということです。

見直し前はSTIで同じテーブルを使っていてモデルが違うリソースがあったのですが同一routesで扱っていました。

resources :hoges do
member do
put :mugyu
put :hogyu
put :kusu
put :poku
end
end

一覧を取得するにも両モデルの一覧をまとめて持ってくるなど、不要なものも持ってきていて非効率的なroutesでした。

ですのでモデルが違えばroutesを変える様に修正しました。

resources :parent_hoges, only: %i[index show update] do
member do
put :mugyu
put :hogyu
end
end
resources :child_hoges, only: %i[index show] do
member do
put :kusu
put :poku
end
end

これで取得したいリソースだけ取得できる、登録、更新系もリソースが明確で分かりやすいURIになりました。投げるURIも明確になってスッキリ!

結果発表

以前のコード記述量に比べてcontrollerで言えば1/4に、modelの記述量は1/6の記述量になりました!!!ß( ̄∇ ̄)

URIpathも分かりやすく、保守、メンテナンスもしやすいコードになりました。きっと後から来る人にも理解しやすい優しいコードになったのではないでしょうか♪(´ε` )

終わりに

現在スタディストでは、マニュアル作成・共有プラットフォームTeachme Bizを一緒に開発していくエンジニアの仲間を募集しています。

レールに乗っかって綺麗なコードを書きたい方。いや、俺はレールなんか乗っかんねぇ、俺がレールを作るんだという意気込みのあるエンジニアのかた是非ともお気軽にお声がけ下さい。