什么是before_create,validates_presence_of,has_many等?

时间:2015-02-11 09:38:29

标签: ruby-on-rails ruby

我理解这些语句做什么,但不了解如何引用它们。它们存在于类中,在该类的方法之外,并执行各种功能。

总的来说,他们叫什么?

2 个答案:

答案 0 :(得分:3)

这些方法实际上只是类方法。试试这个:

class Test
  def self.before_create
    puts "before_create"
  end

  before_create
end

您提到的特定用例 - 仅在before_create正文中可用的Rails DSL方法(例如class)通常称为类宏。 Rubys元编程能力为您提供了多种构建方法。一个简单的方法是将它们设为私有:

module Foo
  private

  def before_create
    puts "before_create"
  end
end

class Bar
  extend Foo

  before_create
end

before_create现在可以在类体内访问,但不能从外部访问:

Bar.before_create
NoMethodError: private method `before_create' called for Bar:Class

答案 1 :(得分:1)

在纯Ruby术语中,它们都只是方法调用。

然而,他们确实有一个共同的主题。在构造和使用它们的方式中,您可以将它们视为Domain-Specific Language (DSL)的一部分 - 您列出的那些是Active Record用于创建数据模型的DSL的一部分。

Ruby非常适合创建类似DSL的迷你语言,使用混合或基类来提供一组类方法,这些类方法反过来将使用类方法存储数据或创建方法。元编程技术。