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
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? –
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
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? –