Rails4: использование проблем Rails при вызове обратных вызовов
Используя rails4, я пытаюсь реализовать модель уведомлений. Здесь я использую ActiveSupport::Concern, чтобы отделить код, связанный с уведомлениями, от модели. create_notification_module.rb
module CreateNotificationModule
extend ActiveSupport::Concern
include ActiveModel::Dirty
included do
after_update :notify
after_create :notify
after_create :notify
end
def notify
record = Notification.new(
:ref_table => self.class,
:ref_id => self.id,
:receiver => ? , # owner of the parent model if parent exists
:sender => current_user.id,
:details => self.changes,
:is_read => 0)
record.save!
end
Здесь мне нужно знать, из какого контроллера / модели вызывается этот обратный вызов, чтобы я мог написать свой случай переключения. Например, комментарий к делу: чтобы получить владельца сообщения, к которому пользователь относится, например, к делу: получить владельца msg / cmt, который нравится и т. Д., Любая помощь приветствуется.
1 ответ
Я не знаю точно, что вам нужно, но я бы порекомендовал вам переосмыслить, как он будет работать, потому что кажется, что вы неправильно используете идею о проблеме и собираетесь втянуть себя в беспорядок кода. Если вы пишете оператор switch и проверяете типы для реализации пользовательского поведения для каждого класса, я думаю, что проблема - это неправильный инструмент для использования. Забота, разделяемая между несколькими классами, добавляет одинаковое поведение ко всем этим классам. Похоже, вы хотите поделиться некоторым кодом для СУХОЙ вещи, но затем хотите настроить некоторые аспекты в зависимости от того, какой класс отправляет сообщение. Возможно, здесь лучше использовать вспомогательный метод, который создает класс Notification или NotificationBuilder. Затем каждый класс может получить уведомление и установить его атрибуты в соответствии со своими потребностями. Таким образом, будущие программисты не будут удивлены, когда поведение Comment и User будет отличаться, даже если они оба содержат CreateNotificationModule (что подразумевает, что поведение одинаково).
Я настоятельно рекомендую книгу " Практический объектно-ориентированный дизайн в Ruby: Agile Primer"; это объясняет гораздо красноречивее и убедительнее, чем я, почему утверждение switch, которое вы собираетесь написать, - плохая идея.
Я понимаю, что на самом деле это не ответ, но он не вписался в комментарии. Простите за это.