Можно ли вызвать ActiveResource :: Base # load? - PullRequest
0 голосов
/ 09 декабря 2011

Метод ActiveResource::Base#update_attributes вызывает метод ActiveResource::Base#load, определенный в activeresource-3.1.3/lib/active_resource/base.rb (строка 1255). Я пытаюсь вызвать этот метод load, а не просто update_attributes, чтобы объект не был сохранен немедленно.

  1. Я протестировал это с совершенно новым приложением рельсов. Я подмостила простой объект:

    rails scaffold obj property1:string
    
  2. Затем в консоли рельсов:

    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.

1 Ответ

0 голосов
/ 09 декабря 2011

Вместо этого вы можете использовать .attributes

obj = Obj.new
obj.attributes = { :property1 => "data" }

Экземпляр имеет новые атрибуты, но не был сохранен.

Прочитайте Документы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...