Rails中的无表格模型JSON序列化

时间:2012-07-07 10:33:19

标签: ruby-on-rails json

我有无桌面模型(就像在#219 railscast中显示的那样):

class MyModel
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :attr1, :attr2, :attr3, :attr4

  private
    def initialize(attr1 = nil)
      self.attr1 = attr1
    end

    def persisted?
      false
    end
end

然后我试图在控制器中渲染JSON:

@my_model = MyModel.new
render json: @my_model.to_json(only: [:attr1, :attr2])

但它使用模型的所有属性呈现JSON。

我试图添加

include ActiveModel::Serialization

但它没有改变渲染的JSON。

如何只使用无表格模型的必要属性渲染JSON?

我正在使用Rails 3.2.3

更新

谢谢,伙计们。看来你几乎都是对的。我结合你的解决方案得到了这个:

型号:

include ActiveModel::Serialization

...

def to_hash
  {
    attr1: self.attr1,
    attr2: self.attr2,
    ...
  }
end

控制器:

render json: @my_model.to_hash.to_json(only: [:attr1, :attr2])

我真的不知道接受谁的答案。

更新2

突然出现了新的陌生感。其中一个属性是哈希数组。就像这样:

attr1: [[{name: "name", image: "image"}, {name: "name", image: "image"}],
        [{name: "name", image: "image"}, {name: "name", image: "image"}]]

但现在它丢失了所有内容,看起来像这样:

attr1: [[{}, {}], [{}, {}]]

也许有人知道如何修复它?

更新3 :)

Erez Rabih的回答有所帮助。使用slice代替to_json解决了问题。所以,最终的解决方案是:

render json: @my_model.to_hash.slice(:attr1, :attr2)

3 个答案:

答案 0 :(得分:1)

我知道这不是直截了当但是如何:

render :json => @my_model.attributes.slice(:attr1, :attr2)

您还需要将属性方法定义为:

def attributes
   {:attr1 => self.attr1.....}
end

感谢bender的评论。

答案 1 :(得分:0)

我相信这是因为Object :: as_json在内部调用(看看这个:http://apidock.com/rails/Object/as_json),它没有像:only或:except之类的选项,所以你可以在你的类中覆盖方法to_hash,例如:

def to_hash
  {:attr1 => self.attr1, :attr2 => self.attr2}
end

和to_json将完全按照您的意愿行事。

当然,另一个选择是覆盖方法to_json ...

答案 2 :(得分:0)

您可以将最初的方法(包括AM序列化模块)与Erez的方法混合,documentation建议。

class MyModel
    include ActiveModel::Serialization::JSON
    ....
    def attributes
       {:attr1 => self.attr1.....}
    end
    ...
end