如何覆盖'as_json'或'to_json'方法以便'respond_to'而不包含指定的信息?

时间:2011-03-04 12:43:05

标签: ruby-on-rails ruby security json ruby-on-rails-3

我正在使用Ruby on Rails 3,我想覆盖(可能在模型文件中)as_jsonto_json方法,以便respond_to一个HTTP请求,而不包括一些信息。

在我的帐户模型中我有

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
}

但我需要重构

2 个答案:

答案 0 :(得分:13)

如果只有一个动作,你可以尝试:

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

答案 1 :(得分:0)

最佳解决方案是覆盖模型中的 as_json 方法,如下所示:

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

您可以使用 (这意味着您列出的唯一参数将返回)或使用(这意味着返回除列出的参数之外的所有参数) )。