Witam wszystkich.
mam problem z serializacją danych do JSON. Posiadam dwie klasy:
-
test.rb:
class Test < ActiveModel::Serializer
attr_accessor :id, :userName, :lista, :test2
def initialize params = {}
@lista = Array.new
params.each { |key, value| send "#{key}=", value }
end
end
-
test2.rb:
class Test2 < ActiveModel::Serializer
attr_accessor :id, :userName
def initialize params = {}
params.each { |key, value| send "#{key}=", value }
end
end
-
test_serializer.rb:
class TestSerializer < ActiveModel::Serializer
attributes :id, :userName, :lista
attributes :test2
private
def test2
Test2Serializer.new(object.test2).as_json
end
end
-
test2_serializer.rb:
class Test2Serializer < ActiveModel::Serializer
attributes :id, :userName
end
-
oraz kontroler:
def postem
new_test2 = Test2.new id: 2, userName: 'test2'
new_test = Test.new id: 1, userName: 'test1', test2: new_test2
new_test.lista << '2345';
new_test.lista << 'string';
p new_test;
render json: TestSerializer.new(new_test).as_json
end
W wyniku działania powyższego kodu dostaję:
{
"id": 1,
"userName": "test1",
"lista": [
"2345",
"string"
],
"test2": {}
}
Czy ktoś może mi pomóc z serializacją obiektu test2? Dlaczego nic nie ma?
yan
2
@kondonja spróbuj metodę TestSerializer#test2
zmienić na publiczną
@yan Serdeczne dzięki za podpowiedź to było to poza tym musiałem jeszcze zmienić linijkę z
Test2Serializer.new(object.test2).as_json
na
Test2Serializer.new(object).as_json
Dla potomnych cały poprawny kod poniżej
class TestSerializer < ActiveModel::Serializer
attributes :id, :userName, :lista, :test2
public
def test2
Test2Serializer.new(object).as_json
end
end
1 Like
Witam ponownie.
W nawiązaniu do powyższego tematu mam teraz problem z serializacją listy obiektów.
Otrzymuję błąd:
NoMethodError (undefined method
read_attribute_for_serialization’ for #Array:0x00007f1bb52da460):`
po przedebugowaniu kodu doszedłem że wyjątek wyskakuje na tej linijce kodu:
object.read_attribute_for_serialization(attr)
W zmiennej object jest lista obiektów a podejrzewam że powinien być tam obiekt. Próbowałem w serializerze zamienić linijkę:
Test2Serializer.new(object.test2).as_json
na:
json: object.test2, each_serializer: Test2Serializer
lub:
object.test2, each_serializer: Test2Serializer
jednak są to błędne komendy. Mógłby mi ktoś podpowiedzieć jak powinno wywołanie wyglądać? Wujek google nie pomógł.
Utknąłem na podobnym problemie… Chętnie poznałbym rozwiązanie
yan
6
@kondonja @larsnait możecie wkleić kod, z którym jest problem?