Rails 序列化器 0.10 中的条件属性和方法

Sou*_*nka 1 serialization ruby-on-rails active-model-serializers

class Api::V1::BookSerializer < ActiveModel::Serializer
  attributes :id, :status, :name, :author_name, :published_date

  attributes :conditional_attributes if condition_1?
  belongs_to :user if condition_2?
end
Run Code Online (Sandbox Code Playgroud)

在这里,我想为控制器的基本操作设置条件。

例如,我想仅发送索引操作的条件属性,而不发送其他操作的条件属性。

但据我所知,rails "active_model_serializers", "~> 0.10.0" 并没有给出任何这样的东西。

Cle*_*ler 5

像这样的事情应该可以解决问题:

\n
class Api::V1::BookSerializer < ActiveModel::Serializer\n  attributes :id, :status, :name, :author_name, :published_date\n\n  attribute :conditional_attribute, if: :some_condition?\n  belongs_to :conditional_association, if: :some_other_condition?\n\n  private\n\n  def some_condition?\n    # some condition\n  end\n\n  def some_other_condition?\n    # some other condition\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以用于:unless否定条件。

\n

如果需要,您可以在您的条件下使用instance_options或(请参阅https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/howto/passing_ Arbitration_options.md )或者您可以使用s (请参阅https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/general/serializers.md#scopeinstance_reflectionsscope

\n

注意:据我所知,这仅适用于attribute关联方法 \xe2\x80\x93 ,它不适用于attributes(请参阅https://github.com/rails-api/active_model_serializers/blob/0-10 -stable/lib/active_model/serializer.rb#L204-L210),因为它不传递选项。

\n

我阅读了您关于坚持使用 AM 序列化器的评论,但我仍然会指出:如果您正在寻找比 AM 序列化器更强大、更灵活的解决方案,jsonapi-serializerBlueprinter工作得很好,并且两者都支持条件字段以及条件关联。

\n