基本的铁路问题

时间:2010-12-01 08:44:29

标签: ruby-on-rails

  class Person < ActiveRecord::Base
    validates_uniqueness_of :user_name, :scope => :account_id
  end

我的问题是关于以上三行代码。顺便说一下,我是c ++程序员,也是ruby和rails的新手。这句话让我非常困惑:validates_...那是什么?变量 定义?功能调用?或某事eles。对我来说,这是一个奇怪的线,而不是类定义。

3 个答案:

答案 0 :(得分:2)

这是一个函数调用。您可以将其重写为validates_uniqueness_off(:user_name, :scope => :account_id)。在Ruby中,惯例是忽略这些括号。 Rails为ActiveRecord::Validations模块提供了这些类方法。 rails API可以为您提供有关其定义方式的更多信息,您还可以查看源代码以了解其实现方式。希望有所帮助。

答案 1 :(得分:2)

这是一个函数调用。

该函数在模块中定义(ActiveRecord :: Validations)。 Ruby中的模块是对象,可以附加函数和变量。

您可以包含模块并获取其成员。这是在您的父类中完成的:ActiveRecord :: Base。如果您看一下它的定义,它会从以下内容开始:

module ActiveRecord
  class Base
    include ActiveRecord::Naming
    # ...
    include ActiveRecord::Validations
    #...
  end
end

C ++和Ruby处理类声明的方式存在一些明显的差异。首先,Ruby中没有编译。因此可以在运行时更改类定义。实际上它是声明一个类的默认方式。换句话说:Ruby中的类总是打开的。

其次,类体可以有任何可执行代码。在C ++中,您无法从类定义中调用函数。这没有多大意义。然而在Ruby中,它可以做到,因为你可以进行元编程。这样您就可以调用构造某些成员的函数。这是编写可以编写其他功能的函数。它可以大大提高生产力,同时也是最差错误的来源。

我强烈建议您查阅Ruby Metaprogramming: Declaratively Adding Methods to a Class条目。

答案 2 :(得分:0)

这是一个函数调用。您可以找到here更多模型验证示例。