繁体   English   中英

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" 并没有给出任何这样的东西。

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

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 )或者您可以使用scope s(见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 Serializers 的评论,但我仍然会指出:如果您正在寻找比 AM Serializers 更健壮和灵活的解决方案, jsonapi-serializerBlueprinter工作得很好,并且都支持条件字段以及条件关联。

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

您可以将选项从调用渲染传递给序列化程序:

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM