Aptana StudioでRubyクラスの構造と利用できるメソッドを調べる方法

Aptana StudioでRubyクラスの構造と利用できるメソッドを調べる方法

先の記事に関連して、私はcontrollerオブジェクトがビューで利用できる処までは本で調べることができたのですが、そのcontrollerオブジェクトで利用可能なメソッドにはどんなものがあるのかまでは見つからず。
ということでAptana Studioの機能の中で探すことにしました。
あ、RadRailsパースペクティブ(RadRails1.1.1)の状態で作業しています。

ヘルプを開く F1

私は通常はVB.NETで開発してますし、困ったときはF1ヘルプ!の癖がついてます。
今回もまずはlayout.rhtmlを開き、controllerの記述位置にカーソルを立ててF1ヘルプを実行。
ヘルプのビューが起動し、なにやら検索を開始しましたが…「関連トピック」▼Aptana ERB エディター について ▼ダイナミック・ヘルプ という情報は出てきましたがその他何も情報は出てこない…ちゃんと記述箇所までジャンプしてくれる訳ではなさそうです。これは駄目でした。

宣言を開く F3

次に、他のメニューを探すと「ナビゲート→宣言を開く」というメニューがありました。これっぽいですね。という訳で実行。
・・・ちょっと処理が重くなったりもする(初回実行のみ?)ようですが、そのまま反応なしか、ないしは次項で説明するツールチップ表示が出てきました。F2キーを押した場合と結果が同じ?押し間違い?
*1

Show ToolTip F2

ツールチップ表示は、単語の部分にカーソルを合わせてしばらく待つかF2キーで表示されます。薄黄色です。
以下はその1例。

・ActionView::Base.controller()
・ActionController::Resources::Resource.controller()
・ActionController::Caching::Sweeper.controller()
・ActionController::Pagination::Paginator.controller()
・ActionController::Integration::Session.controller()
・ActiveScaffold::DataStructures::ActionLink.controller()
・ActionController::Resources::Resource.controller()
・ActionView::Base.controller()
・ActionController::Caching::Sweeper.controller()
・ActiveScaffold::DataStructures::ActionLink.controller()
・BaseLoginProxy.controller()
・ActionController::Integration::Session.controller()
・ActionController::Pagination::Paginator.controller()
・ActionController::Caching::Actions::ActionCachePath.controller()

…なんで、同じ行が一杯出るんだろう。
Aptana Studioもメモリ不足でパースペクティブを閉じてくれと言い出したので、Aptanaも落として再起動。
…一瞬AptanaStudio.exeが立ち上がるが、すぐに終了してしまう。
しょうがないのでPC再起動。
PCのシャットダウン中にjavaw.exeを強制終了させるダイアログ出ていたので、JVMが異常停止してたんですかね。
AptanaStudioを使っていると良く起こる事態ですかw
ちなみにPCのメモリは1GBです。
ということはPC再起動は不要でjavaw.exeを強制終了させればよかったのかもしれない。
さて、PC再起動後にAptanaStudioを起動。今度は普通に起動しました。
で、もう一度F2キー実行。

・ActionView::Base.controller()
・ActionController::Resources::Resource.controller()
・ActionController::Caching::Sweeper.controller()
・ActionController::Integration::Session.controller()
・ActionController::Pagination::Paginator.controller()
・ActiveScaffold::DataStructures::ActionLink.controller()

今度はダブりなしです。
でも、ツールチップ内容ではいくつものcontrollerがヒットする…この場合はどれが正解?
しょうがないので、とりあえず素直に一番上のActionView::Base.controllerの情報を探してみます。

階層で型を開く Ctrl+Shift+H

「ナビゲート→階層で型を開く」というメニューがありました。
これを実行。
そうするとダイアログが開き「型を入力してください」の欄にクラス定義を名前空間付で入力すると該当するクラスが絞り込めます。
ここでは

ActionView::Base

と実行すると一致する型が選択されたので、OKします。
すると「階層」ビューが呼び出され…その中身には render_* といったメンバーしか表示されてませんね…controllerはない。
どこにあるんだ。
っと行っても、なんとなく理由は判ります。
Rubyの特色のひとつ、同じクラスを後から別ファイルで定義を追加しても同一クラスとして認識できる機能のおかげですね。#名前失念…
Railsではその機能をホントにフル活用してると噂には聞いていますが…なんだか相当分散して定義しているっぽいです。
でも結局実行時にはActionView::Baseに一連のメンバーとして整理済みで1箇所で紐付けられないといけないはずで、今はその情報だけ欲しいのだけど…困った。

表示を「サブタイプ階層」に変更

でも同じビュー窓の右上に▽マークがあって、ここから表示変更のオプションが実行可能でした。
この中で、今は「型階層」表示だったのを「サブタイプ階層」に変更すると…おお、なんとなくActionView::Baseとして整理済みにされた一連のメンバーが全て出てきたっぽい。
そして見つけました、controller()。

でも、ここからが???

見つけたcontroller()を選択し、まずは「開く」を実行。
そうするとbase.rbという記述箇所にジャンプしました。

  class Base
    include ERB::Util

    attr_reader   :first_render
    attr_accessor :base_path, :assigns, :template_extension
    attr_accessor :controller

Baseクラスのアクセサメソッドのようですね。
でも、そのcontrollerの取得元を更に辿ると…

    def initialize(base_path = nil, assigns_for_first_render = {}, controller = nil)#:nodoc:
      @base_path, @assigns = base_path, assigns_for_first_render
      @assigns_added = nil
      @controller = controller
      @logger = controller && controller.logger 
    end

え?ノーチェックでコンストラクタの引数から直接渡されている?
ってことはActionBase::Viewとしてはcontrollerの型はこの時点で意識していない…ってこと?
ということは、ここまで来てやっぱりcontrollerが何のオブジェクトなのかは、誰かに教わるか、全部の呼び出し元をチェックしてまわるしかないということ?
*2
ここでギブアップ。まあ、controllerだからだいたいActionControllerの属性が引っ張れるんだと思うんですけどね。

理解あってるんでしょうか。だれかアドバイスが欲しい。
でも理解があってるのなら、なるほどこれがRails文化。VB.NETやJavaとはやっぱり違うんだなあ。

*3

*1:流石は実行時に動的に変数の型が決まるRuby、だからこの場合でも呼び出し候補になりそうな定義をありったけリストアップしている?単純なパスの文字列検索?

*2:一応このあと、controllerから「呼び出し階層を開く」を実行して呼び出し元らしき位置を総ざらいできないこともなさそうだったんですが

*3:こんなGUIのビューとかに頼らなくてもscript/consoleでコマンド叩いて調べろ、という意見もあると思いますが;;;今回はAptanaでトライしてみましたのでご容赦をw