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にはちょっと関連の記事はあったけど。
こっちはちょっと話題が違うかもだけど、同じような感じでmethodsオプションを利用している。