我有一个用户模型。像
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?
答案 0 :(得分:2)
如果我理解正确,设计attr_accessor :password
会在数据库中隐藏您的密码字段。为了避免这种情况,您可以执行类似
def raw_password
self[:password]
end
def raw_password= (new_password)
self[:password] = new_password
end
当然,这完全无视在数据库中以明文形式存储密码不太安全的事实。 Devise为用户提供了足够的机制来管理自己的密码,因此您不应该将原始密码保留更长时间。
答案 1 :(得分:1)
也许不是最好的解决方案,但通过查看the source code我想您可以检查:name
字段是否出现在班级的_accessible_attributes
字段中。
答案 2 :(得分:1)
您可以通过以下方式检查是否有任何对象方法是attr_accessor:
my_object.respond_to?(:name) && my_object.respond_to?(:name=)
返回值为true表示getter和setter都存在:name。这只是标准的Ruby代码和attr_accessor方法的定义:
为此模块定义命名属性,其名称为symbol.id2name,创建实例变量(@name)以及相应的访问方法以读取它。还创建一个名为name =的方法来设置属性。
您可以通过以下方式检查方法是否为attr_accessible:
MyObject.attr_accessible[:default].deny?(:name)
其中MyObject是模型的类名,并且:name是您要查询的属性。返回值false表示该属性是可访问的。
答案 3 :(得分:0)
我想您是想知道该属性是否只是通过attr_accessor
创建的实例变量或数据库中的实际列。您可以通过User.column_names
获取模型的db列列表。所以像下面这样的类方法可以工作
# User.rb
def self.column_in_db?(attrib)
column_names.include?(attrib.to_s)
end