rails 序列化程序 0.10 中的条件属性和方法

Conditional attributes and methods in rails serializer 0.10

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

这里我想把条件放在控制器的基本动作上。

例如,我想发送 conditional_attributes 仅用于索引操作,而不用于其他操作。

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

我假设您正在尝试从控制器进行渲染。

您可以通过对渲染的调用将选项传递给您的序列化程序:

  render json: @track, serializer: Api::V1::BookSerializer, return_user: return_user?, return_extra_attributes: return_extra_attributes?

然后您可以通过 @instance_options[:your_option] 在序列化程序定义中访问该选项。

在这里,你可能会有这样的东西:

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

  attributes :conditional_attributes if return_conditional_attributes?
  belongs_to :user if return_user?

  def return_conditional_attributes?
    @instance_options[:return_extra_attributes]
  end

  def return_user?
    @instance_options[:return_user]
  end
end

return_extra_attributes?return_extra_attributes? 将是您的控制器中定义的方法

文档在这里:https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/howto/passing_arbitrary_options.md

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

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

  attribute :conditional_attribute, if: :some_condition?
  belongs_to :conditional_association, if: :some_other_condition?

  private

  def some_condition?
    # some condition
  end

  def some_other_condition?
    # some other condition
  end
end

您也可以使用 :unless 作为否定条件。

如果需要,您可以在条件中使用 instance_optionsinstance_reflections(参见 https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/howto/passing_arbitrary_options.md) or you can use scopes (see https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/general/serializers.md#scope

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

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