ActiveRecord モデルの誤ったシリアライズを防ぐ方法

ActiveRecordモデルのシリアライズ時にフィールドを指定せずに誤ってシリアライズしてしまうことを防ぐパッチを導入しました。この変更により、どのフィールドが含まれるかを管理し、不完全なデータや過剰なデータが公開されることによる潜在的な問題を回避できます。

デフォルトでは、ActiveRecordモデルをJSONとしてレンダリングするとすべての属性が含まれますが、多くの場合これは望ましくありません。より良いプラクティスを強制するために、シリアライズすべきフィールドを指定する必要があります。

使用例

誤った使用方法:

def show
  @user = User.first
  render json: @user
end

開発環境やテストでは、これにより以下のような結果になります:

ActiveRecordSerializationSafety::BlockedSerializationError:
Serializing ActiveRecord models (User) without specifying fields is not allowed.
Use a Serializer, or pass the :only option to #serializable_hash. More info: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

正しい使用方法:

  1. Serializerの使用
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. :only オプションの使用
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

このドキュメントはバージョン管理されています。変更提案は github で行ってください。

「いいね!」 6

念のため、この状況に遭遇する可能性のある方のために明確にしておきます。これは、ActiveModel::Serialization のすべてのシリアライゼーションメソッド、例えば as_json が、コンテキスト(スペック内を含む)に関わらず、only オプションを渡さない限りエラーになることを意味します。詳細は以下をご覧ください。

例については、以下をご覧ください。

「いいね!」 5

投稿が新しいトピックに分割されました: 新しいシリアライゼーション保護に関するヘルプ

21日かかりましたが、ようやくここでリンクされたコードで、少なくとも1つのコンテキストで、そして上記で言及された分割トピックで言及されているもう1つのコンテキストでも、あなたの言ったことを理解できました。後者はより難しいようです(少なくとも私の記憶では)、問題がどこにあるのかよくわからないからです。

一日(少なくともこの日)を救ってくれてありがとう。:beers:

もう1つの問題は、私のserverモデルにuserモデルが含まれており、サーバーシリアライザーでユーザーシリアライザーを呼び出すか、ユーザーモデルのフィールドを制限する必要があったことでした。

結局、サーバーモデルにユーザーモデルのどれも必要ないことがわかりました(user_id_はすでにそこにあり、それさえも実際には必要ない可能性が高いです)。

「いいね!」 1