1

在我的 Rails 3 应用程序中,我有一个包含我自己的助手的模块,它覆盖了几个内置的 rails 助手:

module MyHelpers
  def form_for(*args)
     ...
  end

  def link_to(*args)
     ...
  end
end

上述模块位于 lib 文件夹中。

我希望这些助手仅用于特定的控制器操作。我的第一次尝试是这样的:

require "my_helpers"
class MyController < ApplicationController 

  before_filter :add_helpers

  def add_helpers
    if some_condition
      ApplicationHelper.send(:include, MyHelpers)
    end
  end
  ..
end

Module.send(:include, ModuleB) 是在另一个模块中包含模块的有效方法,但在这种情况下它不能满足我的需要:我的模块中的方法在视图中不可用。在运行任何控制器方法之前,Rails 似乎已经确定了视图可以使用哪些辅助方法。

有没有办法做我需要的?

我知道我可以全局覆盖 form_for 方法,但我不想这样做。

我认为这个问题的答案将来自于理解 rails 如何使视图可以访问辅助方法。

4

5 回答 5

2

config.action_controller.include_all_helpers 应设置为 false

于 2016-10-17T08:54:43.713 回答
0

由于 Rails 会自动加载并包含app/helpers目录中的所有帮助程序,因此您可以尝试将帮助程序放在不同的位置,例如在lib目录中。

这样 .rb 文件会被解析和加载,但模块不会ApplicationHelper自动包含在类中。然后,您可以按照您的说明在之前的过滤器中执行此操作。

于 2013-04-05T10:10:20.653 回答
0

Vapire 认为将这些模块放置在app/helpers. 我会更进一步,并说您尝试做的事情可能不明智-在每个操作的基础上提供或不提供某些方法对我来说有点太脆弱了。

我宁愿采用在您的控制器之间放置自定义控制器超类并ApplicationController包含模块(或仅在您的超类中包含这些方法)的方法。

于 2013-04-05T10:18:50.343 回答
0

在控制器类或帮助器类上添加帮助器后,它将在请求后保持加载。您需要在操作后卸载它们。不幸的是,没有官方方法可以卸载一部分助手,您需要编写它。

class MyController < ApplicationController
  around_action :load_helper, only: :create

  def load_helper
    self.class.helper_method :your_helper_method
    yield
    self.class.helper { undef your_helper_method }
  end
end
于 2015-12-24T03:52:10.987 回答
-1

答案是使用“helper”类方法,如下所示:

require "my_helpers"
class MyController < ApplicationController 

  before_filter :add_helpers

  def add_helpers
    if some_condition
      MyController.helper MyHelpers
    end
  end
  ..
end
于 2013-04-05T10:42:58.833 回答