如何获取当前控制器实例

时间:2015-11-17 16:32:31

标签: ruby-on-rails ruby-on-rails-3.2

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

my_controller.rb

def create
  MyCreateMutation.run!(params).tap do |result|
    render result ? :success : :error
  end
end

my_mutation.rb

def execute **params
  begin
    # do creation
  rescue => e
  # ⇓⇓⇓⇓⇓
    flash[:error] = e.message
  end
end

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

  • 将当前控制器实例传递给变异并在其上调用flash;
  • 在最顶层的应用程序控制器上声明静态current方法并使用此“全局”变量;
  • 解析caller数组和constantize最顶层找到的控制器;
  • 介绍中间件并将当前控制器实例保存在某处。

以上所有对我来说都是一种矫枉过正。

是否有一种常用的方法来获取当前控制器,如果它出现在堆栈上(堆栈中某处有ApplicationController的方法)?

1 个答案:

答案 0 :(得分:3)

嗯,对于未来的访问者:我最后坚持在current顶部声明ApplicationController类变量:

cattr_accessor :current
before_filter { ApplicationController.current = self }
after_filter  { ApplicationController.current = nil  }

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

ApplicationController.current