2016-08-31 77 views
3

在傳遞'as_json'/'to_json'中的方法來創建對象的json響應時,我們無法在方法中傳遞參數。這是什麼背後的原因並不在「as_json/to_json」as_json不支持參數化方法

例如支撐,

@posts.to_json(
:only => [:title, :body, :created_at, :tags, :category], 
:methods => [:likes_count, :comments_count]) 
} 

在這裏我們能不能通過與參數的方法。

回答

1

這並不支持開箱即用,但我們可以構建它。
For Rails 3.2。加入config/initializers/full_json.rb

module ActiveModel 
    module Serializers 
    module JSON 
     def as_full_json(options = nil) 
     root = include_root_in_json 
     root = options[:root] if options.try(:key?, :root) 
     if root 
      root = self.class.model_name.element if root == true 
      { root => fully_serializable_hash(options) } 
     else 
      fully_serializable_hash(options) 
     end 
     end 
    end 
    end 
end 

module ActiveModel 
    module Serialization 
    def fully_serializable_hash(options = nil) 
     options ||= {} 

     attribute_names = attributes.keys.sort 
     if only = options[:only] 
     attribute_names &= Array.wrap(only).map(&:to_s) 
     elsif except = options[:except] 
     attribute_names -= Array.wrap(except).map(&:to_s) 
     end 

     hash = {} 
     attribute_names.each { |n| hash[n] = read_attribute_for_serialization(n) } 

     # These two lines do the magic. I check if it's Array, and in case it is, it should accept the arguments. 
     method_names = Array.wrap(options[:methods]).select { |n| respond_to?(Array.wrap(n).first) } 
     method_names.each { |n| n.is_a?(Array) ? (hash[n.first] = send(*n)) : (hash[n] = send(n)) } 

     serializable_add_includes(options) do |association, records, opts| 
     hash[association] = if records.is_a?(Enumerable) 
           records.map { |a| a.serializable_hash(opts) } 
          else 
           records.serializable_hash(opts) 
          end 
     end 

     hash 
    end 
    end 
end 

嘗試:

# Here method_with_arg is the method which accepts argument. 'arg' is the argument 
@posts.as_full_json(
:only => [:title, :body, :created_at, :tags, :category], 
:methods => [:likes_count, :comments_count, [:method_with_arg, 'arg']]) 
}.to_json 

我敢肯定,這個代碼可以清理和減少。可能通過使用別名鏈或別的東西。你可以做得更多。讓我知道這是否適合你。

乾杯

+0

謝謝,我會嘗試這個實現,並會讓你知道這是否適用於我。但是,是否有任何特定的原因,你知道這個功能不包括在內? –

+0

我認爲它只是一個轉換爲JSON的API,它已經有了很多選擇和複雜性。我懷疑這不是爲了防止開發者之間更加混淆。 – kiddorails

+0

你認爲應該提出一個包含這個問題的問題嗎?,因爲我已經看到了這麼多的解決方法。如果包括這個,不是一個好主意嗎? –