【Rails】errorsを指定のJSONフォーマットで返却しようとしたら四苦八苦した件


Errors json

Railsでバリデーションチェックをしたりする時などはmodelにvalidateを書いていくと思いますが、この時型のチェックなどにひっかかればエラーメッセージなどがモデルのインスタンスに格納されます。
このメッセージにrailsのフォームビルダーが勝手にアクセスしてくれて、入力フォームのエラー表示などが超絶簡単に実装できるようになっておるのは知っていたのですが、JSONフォーマットで返却したいと思った時ちょとハマりますた。


やりたいこと

・データ保存時のエラーをJSONで返却するAPIを作りたい
・JSONのテンプレートは共通化したい
・ActiveRecordのerrorsに入ってるエラーメッセージを表示したい
ちなみにRailsは3.2

まずモデルのインスタンスのエラーメッセージにアクセスする

modelのインスタンスを@model とすると
errors = @model.errors.full_messages
で取得できる。 返却は配列じゃぞ(ΦωΦ)

※余談だが、i18n対応(ymlの設置)をしていれば中身のメッセージが変動するらしい。

指定のJSONフォーマットのviewに渡して返却

まずはJSONのテンプレートを指定

render "shared/error_json",  :formats => [:json], :handlers => [:jbuilder]

今回はsharedの下に error_jsonという名のテンプレを置いた。
今では後悔している。

次にjsonテンプレの中身

json.status "error"
json.error_code 101
json.set! :message do
  json.array! @errors do |msg|
    json.message msg
  end
end

今回、@errrosが例えば配列で各エラーメッセージが格納されており要素数は不明とする。
jbuilderを使う場合、配列は

json.array! array do | value|
  json.name value
end

↑これで回せるので、それに突っ込む。と。

こうやって見るとすごい単純な話ですが、どうも数時間かかってしまった。
反省、反省。

余談:きたむらがRaiilsばっかり使っている最中、担当内の他サービスはガンガンCakePHP化をしていてゾクゾクする件。

2014-04-16 | Posted in RailsNo Comments » 


関連記事

Comment





Comment



*