这里有两个问题。
第一个问题:方法弃用
在此提交中进行了更改。
该create
方法已从名为. _ ActiveRecord::Base
_ _ActiveRecord::Persistence
关于 APIDock 告诉您的内容……该方法已“弃用或移动”。如果您查看建议列表的一半,您将看到ActiveRecord::Persistence#create
。这是该方法移动到的地方。
请注意,这ActiveRecord::Persistence#create
是内部使用的。在应用程序代码中调用create
ActiveRecord模型(不是对象)时,您正在调用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的更多信息。