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?
将是您的控制器中定义的方法
像这样应该可以解决问题:
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_options
或 instance_reflections
(参见 https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/howto/passing_arbitrary_options.md) or you can use scope
s (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 工作得很好并且两者支持条件字段和条件关联。
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?
将是您的控制器中定义的方法
像这样应该可以解决问题:
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_options
或 instance_reflections
(参见 https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/howto/passing_arbitrary_options.md) or you can use scope
s (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 工作得很好并且两者支持条件字段和条件关联。