2

我正在运行 3.2.13 并遵循标准的“railstutorial.org”,我遇到了一个问题。我仍然掌握从 C++/Java 编程思维方式转换的窍门,并试图理解正常的调用约定。

我可以使用我的类 ( User < ActiveRecord::Base),例如:

User.create(email: "email", password: "password", password_confirmation: "password")

方法的文档表明它已被弃用。def create在我的 ActiveRecord gem 源中,我也没有看到对 a 的引用。

由于调用没有使用哈希,这种调用的名称是什么?如果参数用大括号括起来,是否相同?

4

2 回答 2

4

这里有两个问题。

第一个问题:方法弃用

在此提交中进行了更改。

create方法已从名为. _ ActiveRecord::Base_ _ActiveRecord::Persistence

关于 APIDock 告诉您的内容……该方法已“弃用或移动”。如果您查看建议列表的一半,您将看到ActiveRecord::Persistence#create。这是该方法移动到的地方。

请注意,这ActiveRecord::Persistence#create是内部使用的。在应用程序代码中调用createActiveRecord模型(不是对象)时,您正在调用ActiveRecord::Relation#create.

ActiveResource::Base#create在 Rails 2.0 中引入,与 ActiveRecord 无关。

第二个问题:哈希作为参数

检查源代码显示ActiveRecord::Relation#create以下内容:

# File activerecord/lib/active_record/relation.rb, line 85
def create(*args, &block)
  scoping { @klass.create(*args, &block) }
end

看到 splat 论点了*args吗?这告诉 Ruby 将所有剩余的参数传递给args,无论有多少。Ruby/Rails 的ducktyping 魔术看到一堆键值对并假设它是一个散列。

Rails 有点松散,要求参数中的散列用大括号括起来,就像将所有参数包装在括号中一样松散。通常,当您传入一系列键值对时,Rails 会推断出一个哈希值。有时这会在传入多个散列时引起麻烦,例如在复杂form_for方法中。

如果您在没有大括号的情况下出现异常行为,请插入它们。明确定义哈希将允许您确保正确的行为。

在此处阅读有关 Ruby splats的更多信息。

于 2013-04-11T01:42:06.940 回答
1

“已弃用”并不意味着“不再可用”。这意味着它将不再可用。

于 2013-04-11T00:11:53.843 回答