Добавление обратных вызовов для классов моделей в отдельном файле (RoR) - PullRequest
1 голос
/ 21 января 2010

У меня есть класс модели сообщений (который наследуется от ActiveRecord :: Base). Для конкретного развертывания я хотел бы иметь отдельный файл, который изменяет Сообщение, добавляя обратный вызов. Итак, вместо того, чтобы делать:

# app/models/message.rb
class Message < ActiveRecord::Base
  before_save :foo
  def foo
     puts 'foo!'
  end
end

Я бы хотел иметь возможность:

# app/models/message.rb
class Message < ActiveRecord::Base
end

# config/initializers/fixes.rb
Message
class Message
  before_save :foo
  def foo
     puts 'foo!'
  end
end

Проблема в том, что он работает, когда я запускаю скрипт / консоль, но когда я запускаю его с помощью скрипта / сервера, он обычно этого не делает. Это худшая часть, это не значит, что это никогда не работает. Иногда я запускаю сервер, и он работает, иногда нет, и это без каких-либо изменений в источнике.

Я перезагружаю сам сервер, поскольку (насколько мне известно) инициализаторы запускаются только один раз и не перезагружаются при изменении.

Я знаю, что "иногда" работы очень расплывчаты, но я провел здесь без всякой удачи. Возможно, у кого-то была похожая проблема, или он может предложить другую идею для добавления обратного вызова.

Ответы [ 2 ]

9 голосов
/ 21 января 2010

Почему бы не поместить их в модуль и не импортировать?

class Message < ActiveRecord::Base
  include Message::Callbacks
end

В другом файле вы можете определить все, что вам нравится, например message / callbacks.rb:

module Message::Callbacks
  def self.included(base)
    base.class_eval do
      before_save :foo
    end
  end

  def foo
    # ...
  end
end

Недостатком этого является большая работа по защите методов.

2 голосов
/ 21 января 2010

Почему бы не использовать наблюдателей? (http://api.rubyonrails.org/classes/ActiveRecord/Observer.html)

Например, вы бы сделали что-то вроде этого:

class MessageObserver < ActiveRecord::Observer
  def before_save(message)
    puts 'you win at ruby!'
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...