RoR:从响应中删除敏感字段

时间:2015-06-16 09:24:39

标签: ruby-on-rails ruby rails-activerecord

有没有办法从默认的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?有没有办法创建一个删除敏感字段的帮助器?

1 个答案:

答案 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就绪的哈希。有几个可用的库,或者您可以构建自己的库。