ActiveResource::Base#update_attributes
方法调用ActiveResource::Base#load
中定义的activeresource-3.1.3/lib/active_resource/base.rb
方法(第1255行)。我试图调用load
方法,而不是简单地使用update_attributes
,以便不立即保存对象。
我使用全新的rails应用程序对此进行了测试。我搭建了一个简单的对象:
rails scaffold obj property1:string
然后在rails控制台中:
irb(main):001:0> obj=Obj.new
irb(main):002:0> obj.load(:property1=>"data")
TypeError: can't convert Hash into String
from .../activesupport-3.1.3/lib/active_support/dependencies.rb:234:in `load'
from .../activesupport-3.1.3/lib/active_support/dependencies.rb:234:in `load'
from .../activesupport-3.1.3/lib/active_support/dependencies.rb:223:in `load_dependency'
from .../activesupport-3.1.3/lib/active_support/dependencies.rb:640:in `new_constants_in'
from .../activesupport-3.1.3/lib/active_support/dependencies.rb:223:in `load_dependency'
from .../activesupport-3.1.3/lib/active_support/dependencies.rb:234:in `load'
from (irb):2
我看到activesupport-3.1.3/lib/active_support/dependencies.rb
将Loadable
模块应用于Object
,为每个对象提供了加载文件的load
方法,但我无法弄清楚它为什么会覆盖ActiveResource::Base#load
方法,而不是相反。
我正在使用Rails 3.1.3和朋友。
我想我已经回答了我自己的问题。我一直在尝试在ActiveRecord对象上使用ActiveResource方法。我知道我的Rails模型类是ActiveRecord::Base
的后代,但不知何故,当我试图找到ActiveRecord::Base#update_attributes
的代码时,我找到了ActiveResource::Base#update_attributes
的代码,它看起来像这样:< / p>
def update_attributes(attributes)
load(attributes, false) && save
end
所以我一直在尝试调用load
方法,该方法仅为activesupport提供的对象存在。如果我只查看了ActiveRecord::Base#update_attributes
def update_attributes(attributes, options = {})
# The following transaction covers any possible database side-effects of the
# attributes assignment. For example, setting the IDs of a child collection.
with_transaction_returning_status do
self.assign_attributes(attributes, options)
save
end
end
我会看到assign_attributes
方法就是我需要的方法。
答案 0 :(得分:0)
您可以使用.attributes
而不是这样做obj = Obj.new
obj.attributes = { :property1 => "data" }
该实例具有新属性,但尚未保存。
阅读Docs了解详情。