在返回ActiveRecord对象时,是否有一种开箱即用的方法可以始终隐藏/删除列(例如,User.password)? 感谢。
答案 0 :(得分:16)
使用内置序列化,您可以覆盖模型上的as_json
方法以传递其他默认选项:
class User < ActiveRecord::Base
# ...
def as_json(options = {})
super(options.merge({ except: [:password, :oauth_token] }))
end
end
可能有更好的序列化工具 - 如果您正在寻找更细粒度的控件,我建议您查看active_model_serializers
或rabl
。
答案 1 :(得分:8)
<强> STOP!你做错了。
bug http://e-abaco.net/wp-content/uploads/2009/06/bug-feature.jpg
您不应该,永远不要以纯文本格式保存密码。
您的服务器可能存在或将会存在某种缺陷,黑客可能会获取您的客户密码。想一想:
由于您现在是新人并正在搜索存储密码的正确方法,因此您可以want to read this nice article
答案 2 :(得分: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
答案 3 :(得分: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>