我有一个现有的Rails 3应用程序,我正在添加一个JSON API.我们有一个VendorActiveRecord模型和一个EmployeeActiveRecord模型.一个Employee属于Vendor.在API中,我们要包括Employee的Vendor在JSON序列化.例如:
# Employee as JSON, including Vendor
:employee => {
# ... employee attributes ...
:vendor => {
# ... vendor attributes ...
}
}
Run Code Online (Sandbox Code Playgroud)
这很容易.但是,我有一个业务要求,即公共API不公开内部模型名称.也就是说,对于外部世界,它看起来好像Vendor模型实际上被称为Business:
# Employee as JSON, including Vendor as Business
:employee => {
# ... employee attributes ...
:business => {
# ... vendor attributes ...
}
}
Run Code Online (Sandbox Code Playgroud)
这对于顶级对象来说很容易做到.也就是说,我可以打电话给@employee.as_json(:root => :dude_who_works_here)重新命名Employee,以DudeWhoWorksHere在JSON.但是包括协会呢?我尝试了一些没有成功的事情:
# …Run Code Online (Sandbox Code Playgroud) serialization activerecord json ruby-on-rails ruby-on-rails-3
我正在运行Rails 3并尝试从我们的日志中过滤敏感信息,这些日志是作为post参数传递的JSON blob.例如,用户创建可能会使用user作为JSON对象的字符串值调用post param .JSON对象中的一个键是password,我们想要从日志中过滤掉它.我发现这样做的最好方法是在filter_params中添加一个块,如下所示:
keys_to_filter = ['password', 'password_confirmation']
config.filter_parameters << lambda do |k,v|
if v.is_a? String
keys_to_filter.each do |key|
# Match "key":"<filter_out>", or "key":"<filter_out>"}, allowing for whitespace
v.sub!(/("\s*#{key}\s*")\s*:\s*"[^,\}]*"\s*([,\}])/, "\\1:\"[FILTERED]\"\\2")
end
end
end
Run Code Online (Sandbox Code Playgroud)
这会向filter_params添加一个块,这会导致另一个问题中描述的错误:Rails:ParameterFilter :: compiled_filter尝试重复符号
将块传递给filter_parameters似乎是不安全的,所以我想知道是否有另一种方法可以解决这个问题.