如何理解Ruby类中冒号操作符的用法

时间:2017-03-20 17:48:46

标签: ruby-on-rails ruby

我正在学习Ruby(2.3.x)和Rails(4.x)。我正在浏览Ruby On Rails Tutorial,我遇到了这种语法,但我在阅读它时遇到了麻烦:

${SPARK_HOME}/bin/spark-submit \
--jars ${..add hbase jars comma separated...}
--class ....
.........

此类是否将class User < ApplicationRecord validates :name, presence: true validates :email, presence: true end 定义为接收validates符号和哈希:name的方法?同样的事情也适用于第3行。

或者它是完全不同的东西?所有尝试运行它的结果都是:

presence:true

我看了source(maybe?),但仍然不清楚。

3 个答案:

答案 0 :(得分:2)

这是ApplicationRecord引入的一种特殊DSL。你实际做的是在声明期间调用类中的那些方法。它会将这些验证添加到您的班级,因此每当您尝试保存记录时,如果您没有电子邮件或名称,它将失败

试试这个

user = User.new
user.save
user.valid? # false

尝试在没有validates的情况下做同样的事情。

如果它能让你更清楚,你可以尝试像这样编写这个类

class User < ApplicationRecord
  validates(:name, presence: true)
  validates(:email, presence: true)
end

答案 1 :(得分:1)

validatesActiveModel::Validations中作为类方法实现。

ApplicationRecord模块包含在User中,因此您可以在加载validates类时调用该方法。

{{1}}接受了一个数组,并将该数组的最后一个元素视为选项哈希(如果最后一个元素是哈希值)。

答案 2 :(得分:1)

validates是预定义的helper,Active Record提供在Rails中使用以使验证工作更轻松,这样您就可以使用一些代码来管理多个属性的多个验证。

由于它是Rails中的helper,它也是method模块中定义的ActiveModel,在框架的核心中,请参阅:active_model/validations.rb

最常见的是您遇到问题的presence attribute,它指定所使用的属性不为空,通过{{1}以Ruby方式执行}方法检查传递的值是否不是blank?还是blank

相关问题