Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何检查rails 3中字段的字段类型_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何检查rails 3中字段的字段类型

Ruby on rails 如何检查rails 3中字段的字段类型,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个用户模型。像 class User < ActiveRecord::Base attr_accessor :username :campaign_id attr_accessible :name, :email, :username end 它会回来的 #<User id: 190, name: "sa", :email: "abc@gmail.com", username: "ab"> # 所以问题是:有没有办法检查一个属性,例如“name”是否是att

我有一个用户模型。像

class User < ActiveRecord::Base
  attr_accessor :username :campaign_id
  attr_accessible :name, :email, :username
end
它会回来的

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

所以问题是:有没有办法检查一个属性,例如“name”是否是attr\u访问器attr\u访问器?

也许不是最好的解决方案,但通过查看,我想您可以检查类的
\u accessible\u attributes
字段中是否显示了
:name

我想您是想知道该属性是通过
attr\u accessor创建的实例变量还是数据库中的实际列。您可以通过
User.column\u names
获取模型的db列列表。因此,下面这样的类方法可以工作

# User.rb

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

如果我理解正确,designe
attr\u accessor:password
会在数据库中隐藏您的密码字段。为了避免这种情况,你可以做如下的事情

def raw_password
  self[:password]
end

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

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

您可以通过以下方式检查任何对象方法是否为attr\u访问器:

my_object.respond_to?(:name) && my_object.respond_to?(:name=)
返回值true表示:name的getter和setter都存在。这只是标准Ruby代码和attr_访问器方法的定义:

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

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

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

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

如果不是为了添加测试/rspec,您能解释一下您试图实现的目标吗?实际上。我有一些现有的代码被设备覆盖。原始密码也保存在数据库中。但是对于设备,密码是一个属性访问器字段,因此在我看来,我无法显示密码。我有一些现有的代码被设备覆盖。原始密码也保存在数据库中。但是对于设备,密码是一个属性访问器字段,因此在我看来,我无法显示密码。因此属性密码是一个db列,Desive将其作为属性访问器。您想知道如何在视图中显示数据库中存储的密码吗?
MyObject.attr_accessible[:default].deny?(:name)