代码之家  ›  专栏  ›  技术社区  ›  am-rails MrYoshiji

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

  •  2
  • am-rails MrYoshiji  · 技术社区  · 11 年前

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

    在Rails中,代码通常直接访问项的数据。是否有方法添加一个方法,以便所有直接访问数据的代码现在都通过该方法访问它?

    实例
    鉴于 person = Person.first , person.name 返回Rails中人员的名称,例如“Jack”。假设我希望每个person.name都返回一个带有名称的标题,例如“Dr.”。我应该对person Model做什么?我可以添加一个 name 方法它怎么知道 名称 正在被呼叫?

    class Person < ActiveRecord::Base
    
      #method to change what name returns
    
    end 
    
    3 回复  |  直到 11 年前
        1
  •  3
  •   Rafa Paez    11 年前

    在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
    

    在RailsActiveRecord模型中,您必须使用此语法手动创建属性访问器。

    def name
      self[:name]
    end
    
    def name=(value)
      self[:name] = value
    end
    
        2
  •  1
  •   Paritosh Piplewar    11 年前

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

    您可以使用 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 .

        3
  •  0
  •   sonnyhe2002    11 年前

    可以使用添加同名方法。该方法将覆盖默认方法。

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

    或者您可以创建一个新方法来实现这一点

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