【发布时间】:2013-04-05 09:47:39
【问题描述】:
在我的 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 如何让视图可以访问辅助方法。
【问题讨论】:
-
为什么不直接重命名方法呢?他们显然做了其他事情然后
form_for和link_to正在做。 -
因为我正在开发的库正在做的事情应该适用于任何 Rails 应用程序中的任何控制器。控制器本身不应该知道发生了什么。
-
我强烈建议不要覆盖 Rails 原生的辅助方法。当
link_to没有像 Rails 所说的那样工作时,将抛出一个新的代码。正如 Benjamin 建议的那样,我建议重命名这些方法,并在必要时更新您的视图。
标签: ruby-on-rails ruby-on-rails-3