ActiveRecord:返回对象时隐藏列

zak*_*ssi 13 activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord

是否有一种开箱即用的方法可以在返回ActiveRecord对象时始终隐藏/删除列(例如,User.password)?谢谢.

Zac*_*emp 16

使用内置序列化,您可以覆盖as_json模型上的方法以传递其他默认选项:

class User < ActiveRecord::Base
  # ...
  def as_json(options = {})
    super(options.merge({ except: [:password, :oauth_token] }))
  end
end
Run Code Online (Sandbox Code Playgroud)

可能有更好的序列化工具 - 如果你正在寻找更细粒度的控制我建议检查active_model_serializersrabl.

  • 这解决了问题,但如果我执行类似“@manager.to_json(include: :user)”的操作,我仍然会在用户对象中获取password_digest (2认同)
  • 是的,我也仍然像@Sandeep 所说的那样,有什么解决方案吗? (2认同)

fot*_*nus 8

您是否因为试图隐藏纯文本密码而进入此页面?

停!你做错了.

bug http://e-abaco.net/wp-content/uploads/2009/06/bug-feature.jpg

您不应该,永远不要将密码保存为纯文本.

有可能你的服务器已经或将会有某种缺陷,黑客会得到你的客户密码.想一想:

  • 你会告诉他们什么?
  • 他们将如何反应?
  • 您的业​​务有哪些结果?

由于您现在是一个新人,正在搜索存储密码的正确方法,您可能想阅读这篇好文章


Pin*_*nyM 7

您可以使用:except以下命令在序列化时隐藏特定属性:

render json: @users, except: [:password, :other]
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用after_initialize此方法,并将数据移动到非序列化属性中:

class User < ActiveRecord::Base
  attr_accessor :hidden_password, :hidden_other
  after_initialize :hide_columns

  def hide_columns
    [:password, :other].each do |c|
      send("hidden_#{c}=", send(c))
      send("#{c}=", nil)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)