有没有办法从默认的ActiveRecord产生的结果集中删除敏感字段&#39; all&#39;,&#39; where&#39;,&#39; find&#39;等?< / p>
在我用来学习ruby的小项目中,我在每个对象中都提到了User,但出于安全考虑,我不想公开用户的id 。当我使用简单的HTML响应时,只需不使用它就可以轻松删除user_id。但是对于某些任务,我想使用类似的东西返回一个json:
def index
@my_objects = MyObject.all
respond_to do |format|
...
format.json { render json: @my_objects, ...}
...
end
end
如何阻止列出user_id?有没有办法创建一个删除敏感字段的帮助器?
答案 0 :(得分:0)
您可以使用as_json
来限制JSON响应中序列化的属性。
format.json { render json: @my_objects.as_json(only: [:id, :name]), ...}
如果您想将其设为默认值,则只需覆盖模型本身的方法
class MyObject
def serializable_hash(options = nil)
super((options || {}).merge(only: [:id, :name]))
end
end
尽管这种方法快速有效,但只要您的应用程序变得足够大,可以为同一类型的对象提供多个模型和可能的不同序列化,它就会迅速变得无法维护。
这就是为什么最好的方法是将序列化委托给序列化程序对象。这很简单,但是需要一些额外的工作来创建课程。
序列化程序只是一个返回模型实例的对象,并返回一个JSON就绪的哈希。有几个可用的库,或者您可以构建自己的库。