我需要访问当前控制器或从观察者方法中刷新通知.
class SomeObserver < ActiveRecord::Observer observe :some_model cattr_accessor :current_controller def after_create(record) ... current_controller.flash[:notice] = "Some message!" end end class ApplicationController < ActionController::Base before_filter do SomeObserver.current_controller = self end ... end
解决方法
正如其他人所说,从观察者访问控制器有点违反了MVC原则.给定的答案也适合您的具体用例.
但是,如果您需要更通用的解决方案,您可能会尝试调整Rails sweepers的工作方式.
扫描器是普通的观察者,但是如果从控制器动作调用观察者,它们提供对控制器的访问.
这是通过同时使用扫频机作为观察器和控制器滤波器来实现的,这很容易实现,因为观察者是单体(即它们包括Singleton模块)
简而言之,您必须这样做:
>像往常一样创建观察者.
>将单例实例添加为around_filter到控制器:
class ApplicationController < ActionController::Base around_filter MyObserver.instance #,only: [...] end
attr_accessor :controller def before(controller) self.controller = controller true #Don't forget this! end def after(controller) self.controller = nil end
现在您可以从观察者回调中访问控制器.但是,如果观察者在控制器动作之外被触发,则控制器为零.