Rails:@controller来自哪里?

时间:2016-04-12 07:20:50

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我正在使用旧插件“menu_helper”(遗留代码使用它)。

https://github.com/pluginaweek/menu_helper

该图书馆的正门如下,

module PluginAWeek
  module MenuHelper
    def menu_bar(options = {}, html_options = {}, &block)
      puts @controller.class
      MenuBar.new(@controller, options, html_options, &block).html
    end
  end
end

ActionController::Base.class_eval do
  helper PluginAWeek::MenuHelper
end

代码在rails 2.3.5中运行没有问题但在4.2.6中失败。

当我将@ controller.class放在2.3.5中时,它将始终返回使用此库的当前控制器,但在4.2.6中它将是NillClass。

那么@controller来自哪里?如何在4.2.6中进行修改以使其正常工作。

注1:要使用它,我只需要调用

html = menu_bar(options,:id => 'menuid')

没有传入任何控制器。

注2:我目前正在控制器测试中运行它。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,我不会使用过去5年内未维护的gem,并且主构建当前失败。我试图找到一个维护良好的替代方案,或者如果宝石足够小,可以自己重做。

话虽如此,menu_helper似乎使用了这个变量:https://github.com/pluginaweek/menu_helper/blob/master/lib/menu_helper/menu.rb#L51

如果你想让它工作,做一个before_action,用当前的控制器实例化这个变量:

before_action :set_legacy_controller

def set_legacy_controller
  @controller = controller
end