5

我有一个用户模型。喜欢

class User < ActiveRecord::Base
  attr_accessor :username :campaign_id
  attr_accessible :name, :email, :username
end

如果我获取一个用户记录,例如

u = User.first

它会回来

#<User id: 190, name: "sa", :email: "abc@gmail.com", username: "ab">

所以问题是:有没有办法检查一个属性,例如'name'是attr_accessor还是attr_accessible?

4

4 回答 4

2

如果我理解正确,该设计attr_accessor :password会将您的密码字段隐藏在数据库中。为了避免这种情况,你可以做类似的事情

def raw_password
  self[:password]
end

def raw_password= (new_password)
  self[:password] = new_password
end

当然,这完全忽略了在数据库中以明文形式存储密码不是很安全的事实。Devise 为用户提供了足够的机制来管理他们自己的密码,因此您不应该将原始密码保留太久。

于 2013-09-18T09:07:25.170 回答
1

也许不是最好的解决方案,但通过查看源代码,我想您可以检查是否:name出现在_accessible_attributes您的课程字段中。

于 2013-09-18T07:17:48.493 回答
1

您可以通过以下方式检查任何对象方法是否为 attr_accessor:

my_object.respond_to?(:name) && my_object.respond_to?(:name=)

返回值为 true 表示 :name 同时存在 getter 和 setter。这只是标准的 Ruby 代码和 attr_accessor 方法的定义:

为此模块定义一个命名属性,其中名称为 symbol.id2name,创建一个实例变量(@name)和一个相应的访问方法来读取它。还创建了一个名为 name= 的方法来设置属性。

您可以通过以下方式检查方法是否可访问:

MyObject.attr_accessible[:default].deny?(:name)

其中 MyObject 是模型的类名, :name 是您要查询的属性。返回值为 false 表示该属性是可访问的。

于 2013-09-18T10:23:06.910 回答
0

我猜您想知道该属性是通过创建的实例变量attr_accessor还是数据库中的实际列。您可以通过 获取模型的 db 列列表User.column_names。所以像下面这样的类方法可以工作

# User.rb

def self.column_in_db?(attrib)
   column_names.include?(attrib.to_s)
end
于 2013-09-18T07:50:30.670 回答