2016-06-26 15 views
2

active_model_serializersをバージョン0.9.5から0.10.1に更新しています。バージョン0.9.5では以下のコードが機能しました。ActiveModelSerializers gem:パラメータをシリアライザに渡す方法

コントローラー:

def create 
    ... 
    render json: @dia, app_rights: app_rights(@dia) 
end 

シリアライザ:

class Api::V1::SerializerWithSessionMetadata < ActiveModel::Serializer 
    attributes :app_rights 
    def app_rights 
    serialization_options[:app_rights] 
    end 
end 

バージョン0.10.1に廃止されたserialization_options方法。

  • Here代わりにinstance_optionsを使用することをお勧めします。
  • Hereoptionsを使用することをお勧めします。「instance_optionsは、現在のRCではなく、マスターブランチでのみ使用できます。現在のRCでは、代わりにオプションを使用する必要があります。
  • また、@options@instance_optionsの提案もあります。

私は上記のすべてのオプションをserialization_optionsに置き換えようとしました。ただし、すべての場合において、gemを更新した後、生成されたjsonにはapp_rightsは含まれません。私は間違って何をしていますか? instance_optionsを使用して

+0

どのようなレールとルビーバージョンを使用していますか? Rails 4.0とruby 2.0のchangelogサポートによると – niceman

+0

最新バージョンの使用:ruby 2.3.1とrails 4.2.6 – Marty

+0

hmmm彼らは0.10.xが0.9や0.8と後方互換性がないと言って興味深い「不足している移行ガイド」のバグ? – niceman

答えて

4

、あなたのシリアライザは、次のようになります。

class Api::V1::SerializerWithSessionMetadata < ActiveModel::Serializer 
    attributes :app_rights 
    def app_rights 
     @instance_options[:app_rights] 
    end 
end 

正しいシリアライザが呼び出されることを保証するために、あなたは、このような特定のシリアライザをレンダリングすることができます(それ以外の場合は、クラス上に定義されているものは何でもレンダリングされます@dia):

render json: @dia, serializer: SerializerWithSessionMetadata, app_rights: app_rights(@dia) 
+0

ありがとう、シリアライザを指定することによって、上記の例だけでなく、アプリ全体でシリアライザを指定する必要があります)。これは本当に奇妙なことです。可能であれば、私はこれがなぜであるかを知りたいのです。 これは私が知ったことです:コントローラにシリアライザを指定しないと新しい宝石のバージョンでは、それでも自動的にRIGHTシリアライザが使用されますが、シリアライザのメソッド内で計算された属性はシリアル化されません。言い換えれば、データベースから直接読み取れる属性を直列化するだけです。これについてのアイデアは? – Marty

+0

AMSが適切なシリアライザを見つけられない場合、オブジェクトをjsonに変換するだけで、DB属性のみが読み取られます。 @diaがMyObjectの場合、シリアライザクラスMyObjectSerializerの名前を付けた場合にのみ、AMSは自動的に正しいシリアライザをリンクします。 – johnstoecker

関連する問題