簡體   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