如何获取当前控制器实例
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
是当前控制器的本地代码。我知道,我可以:
- 将当前控制器实例传递给突变并对其调用
flash
;
- 在最顶层的应用程序控制器上声明静态
current
方法并使用这个“全局”变量;
- 解析
caller
数组和 constantize
最上面找到的控制器;
- 引入一个中间件并将当前控制器实例保存在某处。
以上所有内容对我来说都太过分了。
是否有一种通用的方法来获取当前控制器,如果它出现在堆栈上(堆栈上某处有ApplicationController
的方法)?
好吧,对于未来的访客:我终于坚持在最上面声明 current
class 变量 ApplicationController
:
cattr_accessor :current
before_filter { ApplicationController.current = self }
after_filter { ApplicationController.current = nil }
之后,我有一个可用的当前控制器实例:
ApplicationController.current
我有一个控制器,它调用另一个 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
是当前控制器的本地代码。我知道,我可以:
- 将当前控制器实例传递给突变并对其调用
flash
; - 在最顶层的应用程序控制器上声明静态
current
方法并使用这个“全局”变量; - 解析
caller
数组和constantize
最上面找到的控制器; - 引入一个中间件并将当前控制器实例保存在某处。
以上所有内容对我来说都太过分了。
是否有一种通用的方法来获取当前控制器,如果它出现在堆栈上(堆栈上某处有ApplicationController
的方法)?
好吧,对于未来的访客:我终于坚持在最上面声明 current
class 变量 ApplicationController
:
cattr_accessor :current
before_filter { ApplicationController.current = self }
after_filter { ApplicationController.current = nil }
之后,我有一个可用的当前控制器实例:
ApplicationController.current