Метод ActiveResource::Base#update_attributes
вызывает метод ActiveResource::Base#load
, определенный в activeresource-3.1.3/lib/active_resource/base.rb
(строка 1255). Я пытаюсь вызвать этот метод load
, а не просто update_attributes
, чтобы объект не был сохранен немедленно.
Я протестировал это с совершенно новым приложением рельсов. Я подмостила простой объект:
rails scaffold obj property1:string
Затем в консоли рельсов:
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 и друзей.
Обновление:
Кажется, я ответил на свой вопрос. Я пытался использовать методы ActiveResource для объектов ActiveRecord. Я знаю, что мои классы моделей Rails являются потомками ActiveRecord::Base
, но почему-то, когда я пытался найти код для ActiveRecord::Base#update_attributes
, я нашел вместо этого код для ActiveResource::Base#update_attributes
, который выглядит следующим образом:
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
.