我有一个控制器,它调用另一个类(比如一个变异)来执行某些操作。我希望能够指示这种突变与控制流相互作用,例如。 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
的方法)?
答案 0 :(得分:3)
嗯,对于未来的访问者:我最后坚持在current
顶部声明ApplicationController
类变量:
cattr_accessor :current
before_filter { ApplicationController.current = self }
after_filter { ApplicationController.current = nil }
之后,我通过以下方式获得当前控制器实例:
ApplicationController.current