更改as_json的属性名称

时间:2015-11-02 23:56:46

标签: ruby-on-rails ruby-on-rails-4

我有一个使用以下方法的模型:

class Book < ActiveRecord:Base
  def as_json(options = nil)
    if options.nil?
      super(only: [:id, :title, :status, :description])
    else
      super(options)
    end
  end
end

我还有一个看起来像的控制器:

class BookController < ApplicationController
  def search
    books = Book.where(title: params[:keyword])

    render json: books.as_json(only: [:id, :title])
  end
end

是否可以使用第三方应用程序所需的其他名称覆盖:标题符号?我想将:title更改为:value仅用于通过此JSON调用推送。

我尝试过几种不同的事情来覆盖(不在as_json中编写特殊规则,因为这是从应用程序中的几个不同位置调用的)。

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以,这就是我最终使用的解决方案:

在.tap调用之前的JSON:

[{"id"=>4, "book_code"=>"11-292454", "title"=>"How the world turns."}]

对于单个JSON对象:

json = json.tap { |hash| hash["value"] = hash.delete "title" }

对于JSON数组:

json = json.each do |j|
  j.tap { |hash| hash["value"] = hash.delete "title" }
end

.tap调用之后的JSON:

[{"id"=>4, "book_code"=>"11-292454", "value"=>"How the world turns."}]

不知道它是否正确,但似乎对我有用。