如何检查rails 3中字段的字段类型是什么

时间:2013-09-18 07:06:25

标签: ruby-on-rails ruby

我有一个用户模型。像

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

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