2015-09-09 39 views
5

APIリクエストでオブジェクトに返すフィールドを指定できるようにしようとしています。私は、指定されたフィールドのみを持つオブジェクトを取得することができますが、それはシリアライズされたとき、それはエラーがスローされます。実行時にActiveModel :: Serializer属性をオプションにすることはできますか?

ActiveModel::MissingAttributeError (missing attribute: x) 

どのように私はActiveModel::Serializerでこの機能を実現することができますし、それは可能ですか?

答えて

1

シリアライザから属性を削除できますが、存在する必要があります。

class SomeSerializer < ActiveModel::Serializer 
    attributes :something 

    def attributes 
    super.except(:something) if something 
    end 
end 
-1

シリアライザにメソッドを実装することで、属性をカスタマイズできます。最新の安定版(この記事の執筆時点で)0.9.x支店について説明します。

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title, :body, :author 

    def filter(keys) 
    if scope.admin? 
     keys 
    else 
     keys - [:author] 
    end 
    end 
end 
+0

エラーがまだスローされるように、すべての属性を検索した後に問題のフィルタが呼び出されます。 – Adamantish

1

これは、Serializer.attributesメソッドがActiveModel.read_attributeメソッドを使用して各フィールドを呼び出すために発生します。このメソッドは、モデルの定義にvalidates_presence_ofのようないくつかのバリデーションを適用し、例外を発生させます。私は良く、シンプルなものの後3悪いソリューションにを与えることを避けるために:

  • 変更モデル定義が、あなたはあなたの検証を欠場します。
  • この動作を処理するにはActiveModel.read_attributeメソッドを上書きすると、新しい問題が発生します。
  • Serializer.attributesを上書きし、スーパーの代わりにobject.attributesと呼び出してください。

しかし、最適なオプションは、唯一のフィールドだけでなく、他の効果も避けるために、新しいserializeクラスを作成することです。そして、コントローラクラスでこれを指定します。

render json: People.all.reduced, each_serializer: SimplePersonSerializer 

編集1

正しい答えがMaurício Linharesから1にする必要があります。

render json: result.to_json(only: array_of_fields) 
+0

最後の提案は、課題を満たしていません。 OPは、APIコンシューマが特定の定義済みのサブセットではなく、フィールドの任意の組み合わせを指定できるようにしたいと考えています。 – Adamantish

+0

@Adamantishこれのためにありがとう、私はそれが柔軟でなければならないことを認識していない、私の悪い=( – voiski

関連する問題