Rails рендеринг, почему должны вызывать .to_json - PullRequest
0 голосов
/ 06 июня 2018

Я работаю на 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.Смотрите комментарий @ Engineeringmnky.

Спасибо за вашу помощь

Хорошего дня,

1 Ответ

0 голосов
/ 06 июня 2018

В функции show есть record.attributes, поэтому вы получите хеш после атрибутов метода, который можно отобразить как json.В функции создания вы рендерите activerecord, где вы также можете использовать метод attribute или просто конвертировать его с помощью to_json .Рассмотрите возможность использования jbuilder для рендеринга json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...