当我阅读 Rails 代码时,我发现了这个
def save(*)
create_or_update || raise(RecordNotSaved)
end
做什么的*
?:O 我知道当我们使用它时会发生什么*args
,但在这种情况下,它只是简单的*
。
参考https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L119
当我阅读 Rails 代码时,我发现了这个
def save(*)
create_or_update || raise(RecordNotSaved)
end
做什么的*
?:O 我知道当我们使用它时会发生什么*args
,但在这种情况下,它只是简单的*
。
参考https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L119
它的含义与使用参数名称时的含义相同:吞噬所有剩余的参数。除了,因为没有名称可以绑定它们,所以参数是不可访问的。换句话说:它接受任意数量的参数,但忽略它们。
请注意,实际上有一种使用参数的方法:当您在super
没有参数列表的情况下调用时,参数会按原样转发到超类方法。
在这种特定情况下, save 不接受任何参数。这就是赤裸裸的啪啪声所发生的事情。但是,您可能知道,在ActiveRecord
模型上调用 save 接受选项,因为此方法在此处被覆盖ActiveRecord::Validations
:
https://github.com/rails/rails/blob/v3.1.3/activerecord/lib/active_record/validations.rb#L47
# The validation process on save can be skipped by passing <tt>:validate => false</tt>. The regular Base#save method is
# replaced with this when the validations module is mixed in, which it is by default.
def save(options={})
perform_validations(options) ? super : false
end