Is there an out-of-the-box way to always hide/remove a column (say, User.password) while returning an ActiveRecord object?
问问题
4342 次
4 回答
19
使用内置序列化,您可以覆盖as_json
模型上的方法以传递其他默认选项:
class User < ActiveRecord::Base
# ...
def as_json(options = {})
super(options.merge({ except: [:password, :oauth_token] }))
end
end
那里可能有更好的序列化工具 - 如果您正在寻找更细粒度的控制,我建议您查看active_model_serializers
或rabl
.
于 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 回答