ActiveRecord:返回对象时隐藏列

时间:2013-05-02 16:08:33

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord

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

4 个答案:

答案 0 :(得分:16)

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

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

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

答案 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>