ruby-on-rails – Rails:如何访问Observer中的当前控制器?

我需要访问当前控制器或从观察者方法中刷新通知.

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

现在您可以从观察者回调中访问控制器.但是,如果观察者在控制器动作之外被触发,则控制器为零.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...