【问题标题】:Add helper to rails controller instance only仅将助手添加到 rails 控制器实例
【发布时间】: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


【解决方案1】:

我不确定是否有官方的 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
<% extend(@helpers) %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2017-05-25
    • 2017-01-17
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多