Rails呈现为什么必须调用.to_json

时间:2018-06-06 15:33:20

标签: ruby-on-rails ruby ruby-on-rails-3

我在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的评论。

感谢您的帮助

度过愉快的一天,

1 个答案:

答案 0 :(得分:0)

在show函数中有record.attributes,所以你在属性方法之后得到哈希值,它可以呈现为json。在创建函数中您正在渲染activerecord,您也可以使用 attributes 方法,或者只使用 to_json 进行转换。考虑使用jbuilder渲染json