2011-03-04 44 views
10

我正在使用Ruby on Rails 3,並且我想覆蓋(可能在模型文件中)as_jsonto_json方法以便respond_to的HTTP請求不包含某些信息。如何在不包含指定信息的情況下覆蓋'as_json'或'to_json'方法以便'respond_to'?

在我的帳戶模型

def as_json(options = {}) 
    super(
    :except => [ 
     :password 
    ] 
) 
end 

在我的控制器我有

format.json { 
    render :json => @account, :status => 200 
} 

當我提出一個要求,例如,/account/1.json我回來也該密碼屬性是,出於安全原因,我不想要。

那麼,我該如何防止包含指定的信息?


我能做到這一點,它的工作原理

format.json { 
    render :json => @account.to_json(:except => [:password]), :status => 200 
} 

,但我需要重構

+0

我的下列解決方案正在爲我工​​作,無需重構。他們在你的環境中工作嗎? – tommasop

回答

12

如果只是在一個動作,你可以嘗試:

format.json { render :json => @account, :except => :password } 

,如果你需要一個以上的動作比覆蓋效果會更好:

# Exclude password info from json output. 
def to_json(options={}) 
    options[:except] ||= :password 
    super 
end 

同樣是好as_json

# Exclude password info from json output. 
def as_json(options={}) 
    options[:except] ||= :password 
    super 
end 
+0

爲了工作,我必須使用'render:json => @ account.to_json'而不是'render:json => @account'。我認爲有沒有辦法做到這一點,沒有包括'.to_json'... – user502052

+1

在軌3如果你重寫模型中的as_json方法,然後把format.json {render:json => @account}在控制器中作品沒有呼籲to_json – tommasop

+0

對我來說這是行不通的。 - Amico ;-) – user502052

0

最好的解決方法是重寫as_json種方法模型如下:

def as_json options={} 
    super(
    include: {ADD THE RELATIONS YOU WANT TO INCLUDE}).merge({YOU CAN MERGE EXTRA PARAMETER HERE}) 
end 

你可以使用(這意味着你已經列出的唯一參數將返回),或使用除了(這意味着除了返回的所有參數上市的)。

相關問題