blog.waterlow.work

Ruby, Rails, js, etc...

Rails アンチパターン - 色んな顔を持つコントローラ(Controller of Many Faces)

引き続きRails AntiPatternsという本を読んでいます。

https://www.amazon.co.jp/dp/B004C04QE0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

前回は4 Controllersの4つめ「Monolithic Controllers」についてまとめました。

waterlow2013.hatenablog.com

今回は4 Controllersの5つめ「Controller of Many Faces」についてまとめます。

Controller of Many Faces

内容はMonolithic Controllersパート2という感じです。

コントローラの認証の部分は責務過多になりがちです。よくあるのはUsersControllerにloginlogoutというアクションを実装してしまうケースです。
認証はユーザのセッションを管理しているため、操作対象のリソースをuserモデルにする必要がないということに気づきます。

Solution: Refactor Non-RESTful Actions into a Separate Controller

解決策としては、SessionsControllerをつくり以下のようにアクションをもたせます。

class SessionsController < ApplicationController
  def new
    # ...
  end

  def create
    # ...
  end

  def destroy
    # ...
  end
end

newがログイン画面、createがログイン、destroyがログアウトになります。

狭義のREST

newとeditは、実はRESTfulなアクションではありません。たとえばweb apiとしてRailsを使ったときに2つのアクションはなくなります。getアクションとして返すものはなく、RailsのviewのUIのためのアクションであることがわかります。 ただし、これ自体悪いことではなく、逆に自分のアプリケーションを作る際に、controllerに定義していいアクションとして更にプレビュー画面用のアクションを追加することもできます。

まとめ

この章で出てきたSessionsController#new, #create, #destroyは本当にあるある(device gemやRailsチュートリアル)なので覚えておきたいし広めていきたいなと思いました。