Я работаю на Rails API и хочу отрендерить какой-нибудь двоичный файл в json. Для этого я конвертирую свой двоичный файл в шестнадцатеричный, чтобы отобразить его.
Так что я
#<PlayCard id: 3, card_id: 12, atk: 10, hp: 9, deck_id: nil, game_id: nil, uid: ".dk\x8A", created_at: "2018-06-06 15:17:25", updated_at: "2018-06-06 15:17:25", user_id: 27>
(byebug) play_card.to_json
{"id"=>3, "card_id"=>12, "atk"=>10, "hp"=>9, "deck_id"=>nil, "game_id"=>nil, "uid"=>"2e646b8a", "created_at"=>Wed, 06 Jun 2018 17:17:25 CEST +02:00, "updated_at"=>Wed, 06 Jun 2018 17:17:25 CEST +02:00, "user_id"=>27}
У меня вопрос о рендеринге моего объекта. С моим методом show у меня нет проблем, но с моим методом create я должен вызвать в my_object.to_json. У вас есть идея? Без .to_json у меня есть объект ActionDispatch::TestResponse.
def show
record = PlayCard.find_by(id: params[:id])
if record.present?
render json: record.attributes.except('uid'), status: :ok
else
render json: {}, status: :no_content
end
end
def create
play_card = PlayCardsService.create(play_card_params)
if play_card.valid?
render json: play_card.to_json, status: :created
else
render json: { status: 'KO', errors: play_card.errors.full_messages }, status: :unprocessable_entity
end
end
class PlayCardsService
class << self
def create(play_card_params)
PlayCard.create(play_card_params)
end
end
end
def to_json(options = {})
bin = bin_to_hex(self.uid)
self.uid = nil
json = self.as_json
json['uid'] = bin
json
end
def bin_to_hex(s)
s.each_byte.map { |b| b.to_s(16).rjust(2,'0') }.join
end
РЕШЕНИЕ:
Мне нужно переопределить as_json, а не to_json. Посмотрите комментарий @engineersmnky.
Спасибо за вашу помощь
Хорошего дня,
@engineersmnky это работает без as_json





В функции show есть record.attributes, поэтому вы получаете хэш после метода атрибуты, который может быть отображен как json. В функции создания вы выполняете рендеринг activerecord, где вы также можете использовать метод атрибуты или просто преобразовать его с помощью to_json. Рассмотрите возможность использования jbuilder для рендеринга json
Да, но почему to_json вызывается автоматически при показе, а не при создании?
посмотрите здесь: apidock.com/rails/ActionController/Base/render в части рендеринга JSON: «Нет необходимости вызывать to_json для объекта, который вы хотите рендерить, поскольку рендеринг автоматически сделает это за вас»
Да, но я должен что-то делать со своим объектом, но не с моим хешем, я не понимаю
ActiveRecord - сложный объект, и я думаю, что to_json необходим для предоставления возможности перезаписи процедуры сериализации (метод as_json в определении модели)
to_json будет использовать as_json для определения структуры, которую вы должны написать собственный as_json, а не собственный to_json, тогда он должен правильно отображаться без явного вызова
Ваш
PlayCardServiceне поддерживаетas_json