class Person < ActiveRecord::Base
validates_uniqueness_of :user_name, :scope => :account_id
end
我的问题是关于以上三行代码。顺便说一下,我是c ++程序员,也是ruby和rails的新手。这句话让我非常困惑:validates_...
那是什么?变量
定义?功能调用?或某事eles。对我来说,这是一个奇怪的线,而不是类定义。
答案 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更多模型验证示例。