如何获取当前控制器实例

How to get the current controller instance

我有一个控制器,它调用另一个 class(例如,突变)来执行某些操作。我希望能够指示这个突变来交互控制流,e。 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 是当前控制器的本地代码。我知道,我可以:

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

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

好吧,对于未来的访客:我终于坚持在最上面声明 current class 变量 ApplicationController:

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

之后,我有一个可用的当前控制器实例:

ApplicationController.current