在 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
甚至使用我们都习惯的相同语法(仅,除了,...)
是否可以在 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
甚至使用我们都习惯的相同语法(仅,除了,...)