【Rails】あるモデルの1属性だけを変更するコントローラーの命名方法
Web系自社開発企業に入社してから初めての投稿です〜
TL;DR
(失敗談)Customerモデルのnote属性のみを変更するコントラーを作った時
業務において直面した実話。
顧客の情報を管理するCustomerモデルがあるとします。
当然、顧客は増えたり減ったりするわけなので、customers_controllerがあり、そこにcreate, destroyなどのアクションがあるわけですが、今回はありませんでした。
なぜなら、Customerにいくつかのサブクラスがあり、そのサブクラスからCRUDするからです。
初学者の方には難しいかもしれませんが、とにかくCustomerモデルにはコントローラーがありません。
しかし私は、Customerモデルの持つ、note属性(顧客の備考を書く欄)を、書き込んだり、変更したりするフォームを作る必要がありました。
Customerモデルには他にも、name, email, sexなどの属性がありましたが、これらは変更することはありません。(個人情報保護の観点)
そうか。
ならば、王道で行こう。
いろいろな実装方法がありましたが、customers_controllerが無いからってトリッキーな方法でいくよりも、Customerモデルの属性を変更するのだから、customers_controllerでやるべきだと考えました。
そこで新米の僕は、customers_controller.rbを作り、そこにupdateアクションを定義し、note属性をいろいろ書き換えれるようにしました。
さぁ完璧だ。
PR送信っと
……
…
(メンター)ねぇねぇyojiくん?
ひゃ!?
customers_controllerという命名は誤解を与える
これ以上長ったらしい小話は聞くに堪えないと思うので正解を言います。
今回の正解は、
note_controller.rb
でした。
ただ、ディレクトリを工夫して、
controllers / customers / note_controller.rb
にするといいです。
要は、命名ってのは、名前を見ただけで中身がわかることが大事なわけです。
/ customers / note_controller.rb にしておけば、Customerモデルのnote属性に関するコントローラーであることは正しく伝わるわけです。
ちなみにこれは、DHHという有名な方が提唱されている割と一般的なソリューションだそうです。