我正在学习Ruby(2.3.x(和Rails(4.x(。我正在学习Ruby On Rails教程,我遇到了这种语法,并且在阅读时遇到问题:
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true
end
此类是否将validates
定义为接受:name
符号和哈希presence:true
的方法?同样的事情也适用于第 3 行。
还是完全是别的什么?所有运行它的尝试都会导致:
uninitialized constant ApplicationRecord.
我查看了来源(也许?(,但仍然不清楚。
ApplicationRecord引入的特殊DSL。您实际要做的是在声明期间在类中调用这些方法。它会将这些验证添加到您的类中,因此每当您尝试保存记录时,如果您没有电子邮件或姓名,它都会失败
试试这个
user = User.new
user.save
user.valid? # false
并尝试在没有validates
的情况下做同样的事情.
如果它会让你更清楚,你可以尝试像这样写这个类
class User < ApplicationRecord
validates(:name, presence: true)
validates(:email, presence: true)
end
validates
在 ActiveModel::Validations
中作为类方法实现。
ActiveModel::Validations
模块包含在 ApplicationRecord
中,因此您可以在加载 User
类时调用该方法。
validates
接受一个数组,并将该数组的最后一个元素视为选项哈希(如果最后一个元素是哈希(。
validates
是 Active Record 提供的预定义helper
,用于在 Rails 中使用,以使验证工作更容易,这样您就可以使用一些单行代码管理多个属性的多个验证。
由于它是 Rails 中的一个helper
,它也是ActiveModel
模块中定义的method
,在框架的核心中,请参阅:active_model/validations.rb
最常见的是你遇到麻烦的presence
attribute
,它指定使用的属性不为空,通过 blank?
方法以 Ruby 方式执行此操作,以检查传递的值是否blank
也不nil
。