蚊帳の中の日記

ゆるく生きてます

render :json でmodelメソッドの処理結果をjsonに追加して返したい

railsでは一般的なやり方なのかどうかわからないけれど、とあるrails apiの処理を読んでいる時にちょっと見慣れないコードがあったのでブログに書いてみる

例えば

def index
  user = User.find(id)
  render json: user
end

これはよく見るコードで、こんな感じでActiveRecordで見つけてきたuserオブジェクトの結果をjson形式で返す。
この場合、Userでnameやらidやら定義されている(?)パラメータしかjsonで返すことができず、「定義されているAttributesだけだとレスポンス受け取り側がわかりづらい事があるかもしれないので、他のAttributesを追加して返したい」とか、ちょっとjsonをイジってから返したいという時にちょっと困る。

この問題を、今回見つけた見慣れないコードが解決しいた。以下、サンプル。

def index
  user = User.find(id)
  render json: user, methods: [:auth?]
end

Userのモデルにdef auth?が定義されていて、その結果をrenderで返すjsonに加えている処理になっていた。

こちらのサンプルだと、auth?で真偽値を返すメソッドで{.....user attribute..... , auth: true }みたいに追加される。 最初見たときのこのメソッドがfalseだったらrenderが実行されないとか、そういう処理なのかな???とか思っちゃたりして挙動がはっきりわからなかったので困惑した。 自分をメンターしてくれてる先輩エンジニアにも相談して、railsのコード読んでどこに定義されてるのか探してみたけど、ぱっと見つからなかった(TODO: これは後で探そう)。

ググったりrailsドキュメントでもrenderにmethodsオプションはない。stackoverflowにはちょっと関連の記事はあったけど。

stackoverflow.com

こっちはちょっと話題が違うかもだけど、同じような感じでmethodsオプションを利用している。

stackoverflow.com