15

Is there an out-of-the-box way to always hide/remove a column (say, User.password) while returning an ActiveRecord object?

4

4 回答 4

19

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

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

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

于 2013-05-02T16:47:58.000 回答
8

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

停止!你这样做是不对的。

您不应该、永远不要以纯文本形式保存密码。

您的服务器可能存在或将存在某种缺陷,黑客将获取您的客户端密码。想了一会儿:

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

由于您现在是一个新人并且正在寻找存储密码的正确方法,您可能想阅读这篇不错的文章

于 2013-05-02T16:50:49.070 回答
7

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

render json: @users, except: [:password, :other]

或者,您可以使用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
于 2013-05-02T16:34:42.093 回答
0

8 年后,Rails 5+ 有一种方法可以忽略/隐藏模型中的列:

ActiveRecord::Migration.new.create_table :my_pages do |t|
  t.string :title
  t.string :body
  t.string :search_tsv
end

class MyPage < ActiveRecord::Base
  self.ignored_columns = %w[search_tsv]
end

MyPage.new

# => #<MyPage:0x00007fa4693b8278 id: nil, title: nil, body: nil>

class MyPage2 < ActiveRecord::Base
  self.table_name = 'my_pages'
  self.ignored_columns = %w[body search_tsv]
end

MyPage2.new

# => #<MyPage2:0x00007fa46845f808 id: nil, title: nil>
于 2021-07-22T13:13:05.327 回答