2016-04-12 8 views
0

私は古いプラグイン "menu_helper"(レガシーコードで使用しています)で作業しています。Rails:@controllerはどこから来たのですか?

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 

コードは問題なくレール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:私は現在、コントローラーのテストでそれを実行しています。

ありがとうございました。

+0

どのバージョンのgemfile.lock'の中に宝石 'menu_helper'がありますか? – born4new

+0

@ born4new私が見つけることができる最新のバージョンはかなり古い0.3.1です。古い2.3.5レールは0.1.0を使用していましたが、4.2.6では0.1.0と0.3.1を試しましたが、どちらも同じ場所で失敗しました。 (at)コントローラはnilです。おかげさまで – user534498

答えて

1

まず、私は過去5年間に維持されていない宝石を使用せず、マスタービルドは現在失敗しています。私は、よく維持されている代替品を見つけるか、または宝石が十分に小さい場合は、自分でやり直すことを試みます。

これは言われて、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 
+0

ありがとうございます。コントローラーをコントローラーに変更しました。今すぐ動作します。だから古いレールでは、現在のコントローラを参照するために(at)コントローラを使用します。新しいバージョンのレールでは、コントローラを使用しますか?私はApplicationHelper.rbに(at)コントローラを置こうとしましたが、古いレール2.3で動作しますが、4.2では動作しません。しかし、直接置くcontroller.classは4.2で動くでしょう。 – user534498

+0

正直言って、私はRails 2を使ったことはありませんでしたが、それはあらかじめ '@ controller'だったと思います。 – born4new

+0

ありがとうございます。私は古い宝石を使用することは良くないと知っていますが、上司は遺産から移住する必要があります。あるいは、おそらく私はmenu_helper gemを使わずにそれらのメニューhtmlを直接印刷することができます。ライブラリ自体を移行するよりも早くてもlolzです。 – user534498

関連する問題