2013-07-26 12 views
7

私はJSONオブジェクトで応答するRailsコントローラを持っています。のは、この理論的な例を見てみましょう:Rails 4 - Railsのレスポンスオブジェクトのカスタマイズ(json)フォーマット

respond_to :json 
def index 
    respond_with Comment.all 
end 

これは私が探して

[{"id":1,"comment_text":"Random text ", "user_id":1 ,"created_at":"2013-07-26T15:08:01.271Z","updated_at":"2013-07-26T15:08:01.271Z"}] 

ようなもので応答するには、JSONオブジェクトとリターンの整形を妨害する「ベストプラクティス」方法であり、このような何か:

[{"id":1,"comment_text":"Random text ", "username": "John Doe", "user_id":1 ,"created_at":"3 hours ago"}] 

あなたが見ることができるように、私は、データベースモデル「ユーザ名」に存在しない列を追加している、「i「がupdated_atのを」アウト取っている、と私は、フォーマットしていますcreated_at "を日付ではなく人間が判読可能なテキストを含みます。

誰でも考えられますか?

+0

あなたの最善の策は、JBuilderのにある:それは、デフォルトではRailsの4に含まれているhttps://github.com/rails/jbuilder 。 – germs12

答えて

4

2つの方法:

最初:あなたはJSONに変換しますハッシュを構築し、返すビューを定義します。

コントローラ:

YourController < ApplicationController 
    respond_to :json 

    def index 
    @comments = Comment.all 
    end 
end 

ビュー:index.json.erb

res = { 
    :comments => @comments.map do |x| 
    item_attrs = x.attributes 
    item_attrs["username"] = calculate_username 
    end 
} 

res.to_json.html_safe 

二:私はあなたのモデルのas_json方法を再定義したい珠玉active_model_serializers

3

を使用しています。あなたのコメントモデルで

def username 
    "John Doe" 
end 

def time_ago 
    "3 hours ago" 
end 

def as_json(options={}) 
    super(:methods => [:username, :time_ago], except: [:created_at, :updated_at]) 
end 

あなたのコントローラ

as_jsonを上書きまたはJSON ERBビューでの作業as_json

+0

to_jsonメソッドを使用して、簡単で簡単なオプションを渡します。さまざまなアクションを簡単に使用して、より多くの、または少ない属性をモデルから渡すことができます。すべての詳細は上記のドキュメントにあります –

12

のドキュメントを見てみましょう変更する必要はありませんすることができます扱いにくいので、ActiveModelシリアライザ(またはRABL)を使うほうがいいです:

class CommentSerializer < ActiveModel::Serializer 
    include ActionView::Helpers::DateHelper 

    attributes :id, :created_at 

    def created_at 
    time_ago_in_words(object.created_at) 
    end 

end 
詳細については、こちらを

ルック:

  1. https://github.com/rails-api/active_model_serializers
  2. https://github.com/nesquena/rabl