Ruby on rails 仅将辅助对象添加到rails控制器实例

Ruby on rails 仅将辅助对象添加到rails控制器实例,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在运行时定义了一些特定于单个调用的帮助程序,例如控制器的单个实例(下一个调用可能有不同的帮助程序方法)。是否有一种稳健的方法可以将助手方法添加到控制器实例及其视图中,而不将助手添加到此控制器的其他实例和视图中? 要为所有实例定义帮助器,可以使用.helper\u方法方法,例如 class Article < ApplicationController helper_method :my_helper def my_helper # do something end

我在运行时定义了一些特定于单个调用的帮助程序,例如控制器的单个实例(下一个调用可能有不同的帮助程序方法)。是否有一种稳健的方法可以将助手方法添加到控制器实例及其视图中,而不将助手添加到此控制器的其他实例和视图中?

要为所有实例定义帮助器,可以使用
.helper\u方法
方法,例如

class Article < ApplicationController
  helper_method :my_helper

  def my_helper
    # do something
  end
end
但我不喜欢这种方法,因为我使用的是一种明确的私有方法,在将来很容易改变(请参阅前面的
\uu

如果我只需要控制器实例中的助手,我可以直接在实例上调用
#define_singleton_方法
,但这不会使它对视图可用


因此,我正在寻找一种官方的“Rails方式”来为控制器的单个实例和它的视图定义一个助手,就像Rails提供的class方法
。helper\u方法

我不确定是否有Rails的官方方式来做到这一点

您可以创建一个匿名模块并从中进行扩展。由于此解决方案使用纯Ruby,因此必须同时扩展控制器和视图

before_action :set_helpers, only: :index

def index
  # ...
end

private

def set_helpers
  @helpers = Module.new do |mod|
    define_method(:my_helper) do
      # do something
    end
  end

  extend(@helpers)
end


为什么要将助手添加到控制器的单个实例中?对于我们的内部工具,开发人员可以在数据库中定义视图并为其分配变量。控制器的一个动作呈现这个视图,需要在每个记录的基础上动态定义helpers。我建议将逻辑移到动态装饰器对象,但我不能确定
before_action :set_helpers, only: :index

def index
  # ...
end

private

def set_helpers
  @helpers = Module.new do |mod|
    define_method(:my_helper) do
      # do something
    end
  end

  extend(@helpers)
end