如何在Rails中添加一个返回“变量”的方法?

时间:2014-02-23 03:07:39

标签: ruby-on-rails ruby ruby-on-rails-3

在Java中,类中的变量通常是私有的,因此外部类通过访问器和mutator方法访问它们。这使得可以在一个地方更改方法,以便访问它的所有其他代码也会更改。

在Rails中,代码通常直接访问项目的数据。有没有办法添加方法,所以现在直接访问数据的所有代码都通过方法访问它?

示例
给定person = Person.firstperson.name返回Rails中Person的名称,例如“插口”。假设我希望每个person.name都返回一个带有名称的标题,例如“Dr.”。我应该怎么做人员模型呢?我可以添加name方法吗?如何知道被调用的name

class Person < ActiveRecord::Base

  #method to change what name returns

end 

3 个答案:

答案 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。此方法会创建readerwriter。您还可以显式创建此方法。模型内部的实例变量可通过self关键字访问。它基本上是其模型对象的占位符。因此,当您执行self.name时,意味着user.name代表User模型。

上面提到的你有名称有“杰克”并且你想修改为“杰克博士”的情况。理想情况下,您必须使用before_savebefore_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模型对象时才能访问它。在模型中,selfuser相同。

答案 2 :(得分:0)

您可以添加具有相同名称的方法,并覆盖默认方法。

def name
  return "Dr. #{self.name}"
end

或者您可以创建一种新方法

def formal_name
   "Dr. #{self.name}"
end