2016-08-31 3 views
3

Während Methoden in 'as_json'/'to_json' übergeben werden, um die json-Antwort eines Objekts zu erzeugen, können wir keine Parameter in Methoden übergeben. Was ist der Grund dahinter nicht in ‚as_json/to_json‘ unterstützt wirdas_json unterstützt keine parametrisierten Methoden

Zum Beispiel

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

Hier können wir diese Methoden nicht mit Argumenten übergeben.

Antwort

1

Dies wird nicht von Anfang an unterstützt, aber wir können dies bauen.
Für Schienen 3.2. Fügen Sie dieses in config/initializers/full_json.rb hinzu.

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 

Versuchen:

# 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 

Ich bin sicher, kann dieser Code gereinigt und verringert werden. Möglicherweise durch Verwendung von Alias-Kette oder etwas anderes. Du kannst es weiter machen. Lassen Sie mich wissen, ob dies für Sie funktioniert.

Prost

+0

danke, ich werde versuchen, diese Umsetzung und lassen Sie wissen, ob dies für mich funktioniert. Aber gibt es einen bestimmten Grund, warum Sie wissen, dass diese Funktionalität nicht enthalten ist? –

+0

Ich denke nur als eine API, die zu JSON konvertiert, hat es bereits so viele Optionen und Komplexität. Ich vermute, dass dies nicht hinzugefügt wurde, um mehr Verwirrung zwischen den Entwicklern zu vermeiden. – kiddorails

+0

meinst du, ein Problem sollte angesprochen werden, um dies zu integrieren ?, weil ich so viele Problemumgehungen dafür gesehen habe. Wäre es nicht eine gute Idee, wenn dies enthalten ist? –

Verwandte Themen