如何覆盖’as_json’或’to_json’方法以便’respond_to’而不包含指定的信息?
我正在使用Ruby on Rails 3,我想覆盖(可能在模型文件中) as_json
或to_json
方法,以便在不包含某些信息的情况下响应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 }
但我需要重构 。
如果它只在一个动作中你可以尝试:
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
最好的解决方案是覆盖模型中的as_json方法,如下所示:
def as_json options={} super( include: {ADD THE RELATIONS YOU WANT TO INCLUDE}).merge({YOU CAN MERGE EXTRA PARAMETER HERE}) end
您可以仅使用(这意味着您列出的唯一参数将返回)或使用except (这意味着返回除列出的参数之外的所有参数)。