条件付きレール
最後の数週間、Ruby on Railsを学んでいる間、私の最も一般的な検索の1つはSerializerでした.私が遭遇した問題は、ほとんどの場合、シリアライザーをモデル内の1つのアクションだけで使用しようとしていました.
ここでは、私が遭遇した問題とどのように解決したかを示す例です.私が働いていたモデルはエピソードでした、そして、私が取り組んでいた2つの行動は、ショーとインデックスでした.私はすべてのエピソードをインデックスのアクションと一緒に自分の属性と一緒に表示していた.そして、私はショーアクションでエピソードだけを表示することを見ていました、また、そのエピソードに関連する入れ子になったゲスト情報で.シリアライザーをショーアクションで利用しようとすると、インデックスのアクションにも影響しました.
これを回避するために、私はシリアライザでフラグを使用しました.シリアライザーのフラグを使用してシリアライザーを適用する必要がないアクションにシリアライザーを制限することができます.以下は私のシリアライザーと私のコントローラのコードです.
ここでは、私が遭遇した問題とどのように解決したかを示す例です.私が働いていたモデルはエピソードでした、そして、私が取り組んでいた2つの行動は、ショーとインデックスでした.私はすべてのエピソードをインデックスのアクションと一緒に自分の属性と一緒に表示していた.そして、私はショーアクションでエピソードだけを表示することを見ていました、また、そのエピソードに関連する入れ子になったゲスト情報で.シリアライザーをショーアクションで利用しようとすると、インデックスのアクションにも影響しました.
これを回避するために、私はシリアライザでフラグを使用しました.シリアライザーのフラグを使用してシリアライザーを適用する必要がないアクションにシリアライザーを制限することができます.以下は私のシリアライザーと私のコントローラのコードです.
class EpisodeSerializer < ActiveModel::Serializer
attributes :id, :date, :number
has_many :guests, if: :condition
def condition
@instance_options[:flag] != "restrict"
end
end
class EpisodesController < ApplicationController
def index
@episode = Episode.all
render json: @episode, flag: "restrict", status: :ok
end
def show
episode = Episode.find(params[:id])
render json: episode, serializers: EpisodeSerializer, status: :ok
end
end
以下はインデックスアクションのレスポンスです.[
{
"id": 1,
"date": "1/11/99",
"number": 1
},
{
"id": 2,
"date": "1/12/99",
"number": 2
},
......
エピソードシリアライザーの結果として、ネストされたゲストデータとの1つのエピソードに対するショーアクションの応答です{
"id": 1,
"date": "1/11/99",
"number": 1,
"guests": [
{
"id": 1,
"name": "Michael J. Fox",
"occupation": "actor"
}
]
}
これは私の最初のブログ記事であり、私はレールに新しいので、任意の提案がある場合は、以下のコメントを残して自由に感じてください!Reference
この問題について(条件付きレール), 我々は、より多くの情報をここで見つけました https://dev.to/bc_kelly/conditional-rails-serializers-og9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol