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

RoR: removing sensitive field from response

是否有任何方法可以从默认 ActiveRecord 'all'、'where'、'find' 等生成的结果集中删除敏感字段?

在我用来学习的一个小项目中 ruby 我在每个对象中都有对 User 的引用,但出于安全原因,我不想公开用户的 ID。当我使用简单的 HTML 响应时,很容易通过不使用它来删除 user_id 。但是对于某些任务,我想 return a json 使用类似的东西:

def index
  @my_objects = MyObject.all

  respond_to do |format|
    ...
    format.json { render json: @my_objects, ...}
    ...
  end
end

如何防止 user_id 被列出?有没有什么方法可以创建一个删除敏感字段的助手?

您可以使用 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

尽管这种方法快速有效,但一旦您的应用变得足够大以具有多个模型并且可能对同一类型的对象进行不同的序列化,它很快就会变得难以维护。

这就是为什么最好的方法是将序列化委托给序列化程序对象。这很容易,但是需要一些额外的工作来创建 class.

序列化器只是一个对象,returns 一个模型的实例,returns 一个 JSON-ready hash。有几个可用的库,或者您可以构建自己的库。