如何获取当前控制器实例

Ale*_*kin 2 ruby-on-rails ruby-on-rails-3.2

我有一个控制器,它调用另一个类(例如,突变)来执行某些操作。我希望能够指示此突变与控制流交互,例如redirect_to或显示flash通知。在伪代码中,这看起来像:

\n\n

my_controller.rb

\n\n
def create\n  MyCreateMutation.run!(params).tap do |result|\n    render result ? :success : :error\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

my_mutation.rb

\n\n
def execute **params\n  begin\n    # do creation\n  rescue => e\n  # \xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\n    flash[:error] = e.message\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面代码的问题在于flash当前控制器的本地代码。我知道,我可以:

\n\n
    \n
  • 将当前控制器实例传递给突变并调用flash它;
  • \n
  • current在最顶层的应用程序控制器上声明静态方法并使用此 \xe2\x80\x9cglobal\xe2\x80\x9d 变量;
  • \n
  • 解析一个caller数组和constantize找到的最顶层的控制器;
  • \n
  • 引入一个中间件并将当前控制器实例保存在某处。
  • \n
\n\n

以上所有内容对我来说似乎都太过分了。

\n\n

如果当前控制器出现在堆栈上(堆栈上的某个地方有一个方法ApplicationController ,是否有一种通用的方法来获取当前控制器?

\n

Ale*_*kin 5

好吧,对于未来的访客:我最终坚持current在最顶部声明​​类变量ApplicationController

cattr_accessor :current
before_filter { ApplicationController.current = self }
after_filter  { ApplicationController.current = nil  }
Run Code Online (Sandbox Code Playgroud)

之后,我可以通过以下方式获得当前的控制器实例:

ApplicationController.current
Run Code Online (Sandbox Code Playgroud)