我有无表模型(如 #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)