2012-07-07 66 views
1

我無表格模型(就像是在#顯示219 railscast):無表模型JSON序列中的Rails

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 :)

埃雷茲Rabih的回答幫助。用slice代替to_json解決了這個問題。所以,最終的解決方案是:

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

回答

1

我知道這是不是直線前進,但怎麼樣:

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

你也將需要定義一個屬性的方法:

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

感謝您的評論折彎機。

+0

我想這裏不會有任何集合或方法:屬性... – bender 2012-07-07 11:31:44

0

我相信這是因爲對象:: as_json在內部調用(看看這個:http://apidock.com/rails/Object/as_json),它有沒有選項,如:只或:除了,這樣你就可以在此改變方法to_hash在你的班級,例如:

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

和to_json會做你想要的。

當然,另一種選擇是重寫方法to_json ...

+0

我與OP有同樣的問題,這似乎並沒有改變我的任何東西...... – turboladen 2014-11-13 22:29:43

0

您可以將您的初始方法(包括AM序列化模塊)與Erez的一個混合,如documentation所示。

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