📱

devise(gem)で出てくる respond_withメソッドって何者?

2022/12/13に公開

respond_withとの遭遇

アプリに認証機能入れようと思って、定番と呼ばれているdeviseを導入したものの、かなりブラックボックスだったもんで、ドキュメント読みに行ったり、ソースコード覗きながら理解しようと努めていました。

会員登録の際にどのような挙動になっているか
registrations_controller.rbファイルを覗きに行ってました。

https://github.com/heartcombo/devise/blob/main/app/controllers/devise/registrations_controller.rb

そこで見かけたrespond_with!!
見たことないし、検索してもいまいちはっきりと答えが探せませんでした。
誰が定義したメソッドで、どうゆうものなのかが気になったので、すこーしだけ調べました。

そもそも

元々はrailsによって定義されたメソッドだったらしいのですが、
Rails 4.2のリリースノートにて、respond_withメソッドはrails本体のメソッドでは無くなったそうです。

参考)
https://railsguides.jp/4_2_release_notes.html#respond-withとクラスレベルのrespond-toの扱いについて

そんでもって、respondersというgemにその機能が移植される形になったそうです。
devise gemと依存性があるため、deviseを入れた際に勝手にインストールされて、勝手に使えるようになっています。

そんで何してるの?

公式なドキュメントが残ってないので、いまいち理解しきれてませんが、jsonやらhtmlやらcontent-typeに合わせてレスポンスするためのメソッドだったという記述がチラチラ見かけました。

一応、respondersのgemに定義がされている部分がありました。
https://github.com/heartcombo/responders/blob/main/lib/action_controller/respond_with.rb

とりあえず、deviseの理解をするために

devise gemを読み解く上で,最低限読み解く上での挙動以下になりそうです。

respond_withの挙動

  1. アクションに対応するテンプレートを探して表示する
  2. テンプレートが無い場合 
      A. GETアクセスだったらテンプレートが見つからないエラーを返す 
      B. GETアクセス以外だったら
        I. validation のエラーがあれば編集(もしくは新規)画面をrender する
        II. validation のエラーが無ければリダイレクト(locationパラメータで指定可能)

つまり、

def create
  if
    redirect_to xxxx
  else
    render xxx
  end
end

と条件分岐を必要がないってこと。らしい。

参考にした記事)

https://apidock.com/rails/v4.0.2/ActionController/MimeResponds/respond_with

http://blog.livedoor.jp/sasata299/archives/51804693.html

Discussion