微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐