2011-07-28 74 views
13

我用我的模型對象的to_json的方法,我做類似創建:Ruby on Rails的3 - to_json不包括所有的屬性

user = User.find(1)

當我做user.to_json,很多屬性缺少,包括編碼的JSON字符串中的user.id。看起來,我已經從用戶模型中添加了attr_accessible的所有屬性都存在,但其他屬性都沒有。也許這就是to_json正在做的事情,但我認爲將id添加到attr_accessible是不行的。

解決此問題的正確方法是什麼?

UPDATE

這看起來是與制定一個具體問題。如果我註釋掉user.rb以下,一切正常:

devise :rememberable, :trackable, :token_authenticatable, :omniauthable

+0

這真的很奇怪......如果你顯式地鍵入'user.to_json(:except =>:created_at)''。 – apneadiving

+0

你嘗試從控制檯工作嗎? to_json之前的對象呢?它具有所有屬性設置嗎? – pasine

+0

對象_does_在to_json之前包含id(在控制檯中驗證)。我試過(:除了=>:created_at),並沒有這樣做。我想知道Devise是否在爲我的對象做些奇怪的事情。 – randombits

回答

5

我沒有檢查,但我相信不會制定適合您;它僅通過attr_accessible包含某些屬性。

在任何情況下解決這個正確的方法是重寫as_json方法,像這樣:

def as_json(options = nil) 
    { 
    my_attr: my_attr, 
    etc: etc 
    } 
end 

這是一個簡單的哈希,它的產生JSON在AR一個真正強大的方法,而不與to_json搞亂方法。

0

包括這樣的事情在你的模型類:

attr_accessible :id, :email, :password, :password_confirmation, :remember_me 

最初的ID不包括在JSON但之後,我加入它attr_accessible它的工作!

2

默認情況下,設計覆蓋serializable_hash方法以僅公開可訪問的屬性(因此,像encrypted_pa​​ssword這樣的內容在默認情況下不會在API上進行序列化)。

你可以嘗試重寫此方法和AUTH_TOKEN添加到哈希,像這樣:

高清serializable_hash(選項=無) 超(選項).merge( 「AUTH_TOKEN」=> AUTH_TOKEN) 結束

2

設計的確爲您篩選屬性,正如凱恩所說的。然而,我寧願只追加我所需要的,而不是重寫Devise的邏輯。

相反,我寧願做

def as_json(options={}) 
    json_res = super options 
    json_res['locked_at'] = self.locked_at 
    json_res['confirmed_at'] = self.confirmed_at 
end 

或任何其他屬性,您的用戶可能要通過

2

如果你來到這裏尋找Rails的4,像我一樣,這裏的一些信息將有所幫助。

正如艾倫大衛加西亞上面所說,設計優先於serializable_hash。要強制覆蓋,例如,可以執行以下操作,以在致電Model#as_json時返回除password_digest之外的所有屬性。

def as_json(options = {}) 
    options[:force_except] ||= [:password_digest] 
    super(options) 
end 

您可以指定任何所需的模型屬性在options[:force_except]而不是僅僅:password_digest排除。