在Java中,类中的变量通常是私有的,因此外部类通过访问器和mutator方法访问它们。这使得可以在一个地方更改方法,以便访问它的所有其他代码也会更改。
在Rails中,代码通常直接访问项目的数据。有没有办法添加方法,所以现在直接访问数据的所有代码都通过方法访问它?
示例
给定person = Person.first
,person.name
返回Rails中Person的名称,例如“插口”。假设我希望每个person.name都返回一个带有名称的标题,例如“Dr.”。我应该怎么做人员模型呢?我可以添加name
方法吗?如何知道被调用的name
?
class Person < ActiveRecord::Base
#method to change what name returns
end
答案 0 :(得分:3)
在Ruby中存在一些“方法”,可以像Java一样创建getter和setter。
attr_accessor :name # creates getter and setter for @name variable.
attr_reader :name # creates getter for @name variable.
attr_writer :name # creates setter for @name variable.
例如,attr_accessor :name
的代码等同于这些方法
def name # getter
@name
end
def name=(value) # setter
@name = value
end
当然,你可以根据自己的需要修改你的getter或setter
def name
"Dr. #{@name}"
end
在Rails ActiveRecord模型中,您必须使用此语法手动创建属性访问器。
def name
self[:name]
end
def name=(value)
self[:name] = value
end
答案 1 :(得分:1)
Person.name返回Rails中Person的名称,例如“插口”。假设我希望每个Person.name都返回一个带有名称的标题,例如“Dr.”。我应该怎么做人员模型呢?我可以添加名称方法吗?
您可以使用attr_accessor
。此方法会创建reader
和writer
。您还可以显式创建此方法。模型内部的实例变量可通过self
关键字访问。它基本上是其模型对象的占位符。因此,当您执行self.name
时,意味着user.name
代表User
模型。
上面提到的你有名称有“杰克”并且你想修改为“杰克博士”的情况。理想情况下,您必须使用before_save
或before_update
回调。或者,您使用virtual attributes
概念。示例
class User < ActiveRecord::Base
attr_accessible :name_without_title
def name
'Dr. ' + self.name_without_title
end
end
如何知道正在调用哪个名称?
当你打电话给像
这样的模特时user = User.find 1
user.name_without_title = 'Jack'
user.name // returns 'Dr. Jack'
name
不是类方法。只有拥有User
模型对象时才能访问它。在模型中,self
与user
相同。
答案 2 :(得分:0)
您可以添加具有相同名称的方法,并覆盖默认方法。
def name
return "Dr. #{self.name}"
end
或者您可以创建一种新方法
def formal_name
"Dr. #{self.name}"
end