2012-01-09 10 views
1

RESTfulなjsonコントローラで構成されるレール3バックエンドを作成しています。例えば。コントローラーは次のようになります。状況依存のJSONレスポンス

respond_to :json 

def index 
    ... 
    respond_with resources 
end 

... 

これはクライアント上でjQueryによって消費されます。すべてがうまくいっています。

私の次のステップは、コンテキストに応じていくつかのプロパティがシリアル化されないようにJSONを制御することです。例えば。リソースの所有者は、読み取りアクセスのみを持つユーザーよりも多くのプロパティを送信します。

私は現在、Draperに向かっており、ユーザーの役割に基づいてモデルごとに別々のデコレータを使用しています。

私の問題は、これは多くの定型文を生成していることです。私は現在、ロールベースの認証にcancanを使用しています。

誰でもこれを達成するためのより良い方法を提案できますか?

答えて

1

ActiveModel :: Serializerの使用をお勧めします。 https://github.com/josevalim/active_model_serializers

公開するリソースごとにシリアライザを作成します。各モデルのシリアライゼーションロジックを分離し、他のメソッドを簡単に公開し、ロールに基づいて各モデルをスコープできます。 CanCanとうまく機能します。

私は、たとえば、この構文を好き:

class MonkeySerializer < ActiveModel::Serializer 
    attributes :name, :mom, :weight 

    private 

    # use this for a custom attribute not on the model 
    def weight 
    monkey.weight_in_pounds 
    end  
end 
+0

は、あなたが逆に使用するものがありますか?例えば。クライアントからデシリアライズしますか? – ghempton

+0

request_hash = ActiveSupport :: JSON.decode(request.body) – tee

+0

を参照してください。http://stackoverflow.com/questions/1826727/how-do-i-parse-json-with-ruby-on-rails – tee

関連する問題