【发布时间】:2020-01-27 10:06:35
【问题描述】:
我有一些在运行时定义的特定于单个调用的助手,例如控制器的单个实例(下一次调用可能有不同的辅助方法)。有没有一种稳健的方法可以将辅助方法添加到控制器实例并且它只是视图,而不将辅助方法添加到该控制器的其他实例和视图?
要为所有实例定义助手,您可以使用.helper_method 方法,例如
class Article < ApplicationController
helper_method :my_helper
def my_helper
# do something
end
end
我在源代码中四处挖掘,发现了(相当私密的)#_helpers 方法,它返回一个包含此实例的所有帮助程序的模块。我现在可以使用一些元编程来定义我在这个模块上的方法
def index
_helpers.define_singleton_method(:my_helper) do
# do something
end
end
但我不喜欢这种方法,因为我使用的显然是私有的预期方法,将来很容易改变(参见前面的 _)。
如果我只需要控制器实例中的帮助器,我可以直接在实例上调用#define_singleton_method,但这并不能使它对视图可用。
所以我正在寻找一种官方的“Rails 方式”来为控制器的单个实例及其视图定义一个助手,就像 Rails 提供的类方法 .helper_method。
【问题讨论】:
-
为什么要向控制器的单个实例添加帮助器?
-
这是我们内部的工具,开发人员可以在数据库中定义视图并为其分配变量。控制器的一项操作会呈现此视图,并且需要在每个记录库上动态定义帮助程序
-
我建议将逻辑移动到动态装饰器对象中,但 TBH 我不能确定
标签: ruby-on-rails ruby