ruby-on-rails – 使用ActiveModel :: Serializers有条件地加载

我正在使用ActiveModel :: Serializers构建API。使用params有条件地加载数据的最佳方法是什么?

所以我可以提出像GET / api /客户的请求:

"customers": {
   "first_name": "Bill",
   "last_name": "Gates"
}

和GET / api /客户?embed = address,note

"customers": {
   "first_name": "Bill",
   "last_name": "Gates"
},
"address: {
   "street": "abc"
},
"note": {
   "body": "Banned"
}

这样的东西取决于参数。我知道ActiveModel :: Serializers有include_ [ASSOCIATION]?语法,但是如何从控制器高效地使用它?

这是我目前的解决方案,但并不整洁:

customer_serializer.rb:

def include_address?
  !options[:embed].nil? && options[:embed].include?(:address)
end

application_controller.rb:

def embed_resources(resources = [])
  params[:embed].split(',').map { |x| resources << x.to_sym } if params[:embed]
  resources
end

customers_controller.rb:

def show
  respond_with @customer, embed: embed_resources
end

必须是一个更简单的方法?

我也在寻找一个有效和干净的方式来做到这一点。

我找到一个解决方案,但它不漂亮。

在我的BaseController / ApplicationController中我添加了这个方法:

serialization_scope :params

所以范围现在是params哈希,我可以在include_ [ASSOCIATION]中使用它?我的序列化器的方法

def include_associations?
    if scope[:embed]
        embed = scope[:embed].split(',') 
        return true if embed.include?('associations')
    end
end

我不喜欢这种方法,因为如果我需要使用范围作为其他的东西像current_user有条件地返回数据,如果它是一个管理员的例子。

但这种解决方案在某些情况下可以工作。

UPDATE

您可以传递view_context而不是直接传递params。

您可以在Serializer中委派保留参数名称而不是范围。

在您的ApplicationController中:

serialization_scope :view_context

在你的串行器中:

delegate :params, to: :scope

而且你可以在include_ [ASSOCIATION]中使用params [:embed]?序列化程序的方法

http://stackoverflow.com/questions/17765061/sideloading-conditionally-with-activemodelserializers

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:ruby-on-rails – 使用ActiveModel :: Serializers有条件地加载