在 after_action 回调中设置变量

Set varaible in after_action callback

是否可以在 after_action 回调中设置实例变量?因为我找不到办法让这个工作...

控制器

[...]
after_action :set_var
[...]
private
def set_var
  @myvar = "something"
end
[...]

但在我看来 @myvar 始终为零。 如果我将 after_action 更改为 before_action 它会起作用,但我确实需要在执行操作后设置此变量。

作为操作的一部分,您的视图将被渲染,因此 after_action 对于您尝试执行的操作来说已经太迟了,因为渲染已经完成。

您可以尝试调整 ApplicationController

中的 render 方法
private
  def render(*arguments)
    set_var
    super(*arguments)
  end
  def set_var
    @my_var = 'something'
  end
end

我没试过这个。您需要检查它是否适用于显式和隐式渲染。 ......

您可以覆盖应用程序控制器中的 #render 方法。

class ApplicationController < ActionController::Base
  def render(*args)
    # do stuff here
    super
  end
end

after_action 回调函数在 render 方法执行后调用,所以它对你不起作用。

您不能在操作后将实例变量传递给视图,因为控制器已经渲染了视图并且所有实例变量还没有assigned there

因此您需要在动作内部或动作之前传递实例变量。

我不认为你真的需要猴子补丁 ActionController 方法。

问题很可能可以通过其他方式解决。

好的,经过一番搜索,我发现了这个: https://gist.github.com/pietromoro/f13e5ee07537cec649d41b6827a03f99 这实际上解决了我的需求。太棒了,它为控件创建了一个新的回调,让我写 before_render :set_var 甚至使用我们都习惯的相同语法(仅,除了,...)