ruby-on-rails - rails : How to access current controller in an Observer?

标签 ruby-on-rails ruby controller observer-pattern

我需要访问当前 Controller 或从观察者方法中发出通知。

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

最佳答案

正如其他人所说,从观察者访问 Controller 在某种程度上违反了 MVC 原则。给出的答案也适合您的特定用例。

但是如果您需要更通用的解决方案,您可以尝试调整 Rails Sweepers 的工作方式。

Sweepers 是普通的观察者,但它们提供对 Controller 的访问,如果从 Controller 操作调用观察者。

这是通过同时使用清扫器作为观察者和 Controller 过滤器来实现的,这很容易实现,因为观察者是单例的(即它们包含 Singleton 模块)

简而言之,您必须这样做:

  1. 照常创建您的观察者。
  2. 将单例实例作为 around_filter 添加到您的 Controller :

    class ApplicationController < ActionController::Base
      around_filter MyObserver.instance #, only: [...]
    end
    
  3. 将过滤器的方法添加到您的观察者:

    attr_accessor :controller
    
    def before(controller)
      self.controller = controller
      true #Don't forget this!
    end
    
    def after(controller)
      self.controller = nil
    end
    

现在您可以从观察者回调中访问 Controller 。但是,如果观察者是在 Controller 操作之外触发的,则 controllernil

关于ruby-on-rails - rails : How to access current controller in an Observer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8141485/

相关文章:

ruby-on-rails - 在 rails 中以登录用户身份进行测试

ruby-on-rails - 我可以在非嵌套形式中使用 _destroy 属性吗?

ruby-on-rails - Rails,如何添加到方法 html/js?

ruby - rvm use 1.9.2 让我使用 ruby​​ 1.8.7

ruby - 使用 Ruby 编辑 XML

从模型或 Controller 更改 Codeigniter 配置文件

支持单元测试的 PHP 前端 Controller 库

ruby-on-rails - 基于 ruby​​ on Rails 中的另一个下拉菜单填充下拉菜单

ruby-on-rails - minitest_plugin.rb :9 getting wrong number of arguments

javascript - 当我点击另一个内容是从数据库生成的div时,如何更改div的内容