如何检查Rails 3中字段的字段类型

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

如果不是为了添加测试/ rspec,你能解释一下你想要实现什么吗? - nathanvda
实际上,我的一些现有代码被设备覆盖了。原始密码也保存在数据库中。但是对于设备密码,它是一个attribute_accessor字段,因此在我的视图中我无法显示密码。 - Sabyasachi Ghosh
4个回答

2
如果我理解正确,attr_accessor :password 方法可以隐藏数据库中的密码字段。如果要绕过此限制,您可以尝试以下方法:
def raw_password
  self[:password]
end

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

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

1

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

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

返回值为 true 表示 :name 既有 getter 方法又有 setter 方法。这是标准的 Ruby 代码,并且 attr_accessor 方法的定义非常明确:

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

您可以通过以下方式检查方法是否为 attr_accessible:

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

其中MyObject是您的模型类名称,:name是您正在查询的属性。返回false表示该属性不可访问。


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

0

我猜你在尝试知道这个属性是一个通过 attr_accessor 创建的实例变量,还是一个数据库中的实际列。你可以通过 User.column_names 获取模型的数据库列列表。因此,下面的类方法可以起作用。

# User.rb

def self.column_in_db?(attrib)
   column_names.include?(attrib.to_s)
end

实际上,我的一些现有代码被设备覆盖了,并且原始密码也保存在数据库中。但是对于设备密码来说,它是一个属性访问器字段。因此,在我的视图中,我无法显示密码。 - Sabyasachi Ghosh
所以属性密码是一个数据库列,而devise将其作为attr_accessor。您想知道如何在视图中显示存储在数据库中的密码? - tihom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接