[英]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_options
或instance_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-serializer或Blueprinter工作得很好,并且都支持条件字段以及条件关联。
我假设您正在尝试从控制器渲染。
您可以将选项从调用渲染传递给序列化程序:
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.