Ruby on rails 我如何添加一个返回“的方法?”;变量“;在轨道上?

Ruby on rails 我如何添加一个返回“的方法?”;变量“;在轨道上?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,在Java中,类中的变量通常是私有的,因此外部类通过访问器和mutator方法访问它们。这允许在一个地方更改方法,以便访问它的所有其他代码也会更改 在Rails中,代码通常直接访问项的数据。有没有办法添加一个方法,让所有直接访问数据的代码现在都通过该方法访问数据 示例 给定person=person.first,person.name返回Rails中某个人的姓名,例如“Jack”。假设我希望每个person.name返回一个带有名称的标题,例如“Dr.”。我应该对人物模型做什么才能做到这一点?我

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

在Rails中,代码通常直接访问项的数据。有没有办法添加一个方法,让所有直接访问数据的代码现在都通过该方法访问数据

示例
给定
person=person.first
person.name
返回Rails中某个人的姓名,例如“Jack”。假设我希望每个person.name返回一个带有名称的标题,例如“Dr.”。我应该对人物模型做什么才能做到这一点?我可以添加一个
名称
方法吗?它如何知道调用了哪个
名称

class Person < ActiveRecord::Base

  #method to change what name returns

end 
class-Person
您可以添加与同名的方法,该方法将覆盖默认方法

def name
  return "Dr. #{self.name}"
end
或者您可以创建一个新的方法来实现这一点

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

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

def name
  return "Dr. #{self.name}"
end
或者您可以创建一个新的方法来实现这一点

def formal_name
   "Dr. #{self.name}"
end
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\u 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
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\u 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
Person.name返回Rails中某个人的姓名,例如“Jack”。假设我希望每个Person.name返回一个带有名称的标题,例如“Dr.”。我应该对人物模型做什么才能做到这一点?我可以添加一个名称方法吗

您可以使用
attr\u访问器
。此方法创建
读卡器
写卡器
。您还可以显式创建此方法。可以使用
self
关键字访问模型内部的实例变量。它基本上是其模型对象的占位符。因此,当您执行
self.name
时,它意味着
user.name
用于
user
模型

您在上面提到的案例中,您有一个值为“Jack”的名称,您希望将其修改为“Dr.Jack”。理想情况下,您必须在保存之前使用
,或者在更新之前使用
。或者,使用
虚拟属性
概念。范例

class User < ActiveRecord::Base
  attr_accessible :name_without_title

  def name
    'Dr. ' + self.name_without_title
  end
end  
名称
不是类方法。只有当您有
User
model对象时,才可以访问它。在模型中,
self
user
相同

Person.name返回Rails中某个人的姓名,例如“Jack”。假设我希望每个Person.name返回一个带有名称的标题,例如“Dr.”。我应该对人物模型做什么才能做到这一点?我可以添加一个名称方法吗

您可以使用
attr\u访问器
。此方法创建
读卡器
写卡器
。您还可以显式创建此方法。可以使用
self
关键字访问模型内部的实例变量。它基本上是其模型对象的占位符。因此,当您执行
self.name
时,它意味着
user.name
用于
user
模型

您在上面提到的案例中,您有一个值为“Jack”的名称,您希望将其修改为“Dr.Jack”。理想情况下,您必须在保存之前使用
,或者在更新之前使用
。或者,使用
虚拟属性
概念。范例

class User < ActiveRecord::Base
  attr_accessible :name_without_title

  def name
    'Dr. ' + self.name_without_title
  end
end  

名称
不是类方法。只有当您有
User
model对象时,才可以访问它。在模型中,
self
user
相同

您的方法
name
将引发一个
SystemStackError:stack level太深
,如果它是Rails,那么第二个方法应该是视图帮助器,不是模型的实例方法。您的方法
name
将引发
SystemStackError:stack level太深
,如果是Rails,则第二个方法应该是视图助手,而不是模型的实例方法。这不是对您问题的直接回答,但是,如果你想对模型数据执行这些扩充,请考虑添加一个类似于堆栈的视图模型/装饰器实现。这不是你的问题的直接答案,但是如果你想执行这些模型数据的扩充以供演示,考虑添加一个类似于您的堆栈的VIEWModel /装饰器实现。当代码添加到Rails模型中时,该代码将返回NIL:<代码> DEF Nord.name Eng/<代码>我澄清了露比(一个类)VS Rails(ActhvReCordD模型)的答案。。当添加到rails模型时,此代码将返回零:
def name@name end
我澄清了Ruby(a类)与rails(ActiveRecord模型)的答案。如何实现没有标题的
name\u
,这里的更多信息如何实现
name\u而不带标题
attr\u可访问:name\u而不带标题
。还有
attr\u writer:name\u而不带标题
,这里有更多信息