加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:28:06 所属栏目:百科 来源:网络整理
导读:我需要访问当前控制器或从观察者方法中刷新通知. class SomeObserver ActiveRecord::Observer observe :some_model cattr_accessor :current_controller def after_create(record) ... current_controller.flash[:notice] = "Some message!" endendclass App
我需要访问当前控制器或从观察者方法中刷新通知.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读