пытаюсь расширить метод сохранения ActiveRecord :: Base, но получаю ошибку "требуется класс или модуль" - PullRequest
0 голосов
/ 27 января 2012

Вот моя модель AR:

class MyObject < ActiveRecord::Base
   include ContentSyntax # where parse_out_variables is defined
  serialize :variables
  def save
    self.variables = ContentSyntax.parse_out_variables(self.body)
    super
  end
end

сейчас, в моем приложении, я делаю my_object.update_attributes (PARAMS)

, который работал нормально, прежде чем я попытался продлить сохранение.

Я получаю следующую ошибку:

TypeError (class or module required):
  app/models/my_object.rb:64:in `save'

Но я хочу, чтобы этот код выполнялся каждый раз, когда объект сохраняется. (Или если бы изменился только один атрибут («тело»), это было бы лучше)

Как правильно это сделать?

EDIT:

с использованием обратного вызова before_save:

  before_save {
    self.variables = ContentSyntax.parse_out_variables(self.body)
  }

У меня теперь ошибка:

NoMethodError (undefined method `body' for #<Class:0x10a0866b8>):

но ... оно существует!

1 Ответ

3 голосов
/ 27 января 2012

Использование обратного вызова before_save является правильным способом сделать это. Однако, когда вы используете блок с обратным вызовом ActiveRecord, рассматриваемый объект передается в блок в качестве аргумента , так что вам нужно что-то более похожее на это:

before_save { |o| o.variables = o.parse_out_variables(o.body) }

или, может быть, это:

before_save :add_variables

private

def add_variables
    self.variables = parse_out_variables(self.body)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...