[前][次][番号順一覧][スレッド一覧]

rails:3842

From: 前川 てん <somohan@h...>
Date: Mon, 15 Oct 2012 11:43:33 +0900
Subject: [rails:3842] renderメソッドの定義場所が分かりません


みなさん、こんにちわ。
先週木曜日からRailsの学習を始めています。
C/C++とPHPで数年程経験がありますが、
ルビー自体は「プログラミング言語Ruby」を読んだ程度で、
始めて1か月足らずです。
現在Rails開発のごく基本的な部分で躓いております。

書籍の記述に誘導されるまま、rails generate controller hello 
とコマンド実行後、作成された hello_controller.rbにindexメソッドを
追加しました。

class HelloController < ApplicationController
 def index
 render :text => 'hello world'
 end
end

このコードでhello world と表示できるようになるのは分かったの
ですが、renderメソッドを持っているクラス/モジュールを知りたかった
のでhttp://api.rubyonrails.org で調べてみたところ、
メソッド名での検索ができない(?)らしく、埒が明きません。
そこで自分で調べてみようと思い、以下のようなコードを書きました。

-- hello_controller.rb --
 def index
 #自クラス名
 @controller_name = self.class.to_s
 #自クラスがincludeしているモジュール
 included_modules = self.class.included_modules
 
 #自クラスが継承しているクラスを求める
 @ancestors = self.class.ancestors
 ancestor_classes = @ancestors - included_modules
 #各クラスのメソッド名を抽出
 @ancestor_classes =
 ancestor_classes.map{|ac|
 [ac, [eval("#{ac}.class.public_instance_methods"),
 eval("#{ac}.class.protected_instance_methods"),
 eval("#{ac}.class.private_instance_methods")]]
 }
 #各モジュールのメソッド名を抽出
 @included_modules =
 included_modules.map{|im|
 [im, [eval("#{im}.class.public_instance_methods"),
 eval("#{im}.class.protected_instance_methods"),
 eval("#{im}.class.private_instance_methods")]]
 }
 # "#<module>0x..." とかいう無効らしきモジュールが混入するので除去
 @included_modules.delete_if{|e| e[1][0] == nil}
 end
end

-- index.html.erb --
<h1><%=@controller_name -%>classes</h1>
<ul>
<% @ancestor_classes.each do |ac| %>
 <li>
 <h2><%= ac[0] %></h2>
 <dl>
 <dt>public methods</dt>
 <dd>
 <ul>
 <% ac[1][0].each do |method| %>
 <li><%= method %></li>
 <% end %>
 </ul>
 </dd>
 <dt>protected methods</dt>
 <dd>
 <ul>
 <% ac[1][1].each do |method| %>
 <li><%= method %></li>
 <% end %>
 </ul>
 </dd>
 <dt>private methods</dt>
 <dd>
 <ul>
 <% ac[1][2].each do |method| %>
 <li><%= method %></li>
 <% end %>
 </ul>
 </dd>
 </dl>
 </li>
<% end %>
</ul>
<h1><%=@controller_name -%>included modules</h1>
<ul>
<% @included_modules.each do |im| %>
 <li>
 <h2><%= im[0] %></h2>
 <dl>
 <dt>public methods</dt>
 <dd>
 <ul>
 <% im[1][0].each do |method| %>
 <li><%= method %></li>
 <% end %>
 </ul>
 </dd>
 <dt>protected methods</dt>
 <dd>
 <ul>
 <% im[1][1].each do |method| %>
 <li><%= method %></li>
 <% end %>
 </ul>
 </dd>
 <dt>private methods</dt>
 <dd>
 <ul>
 <% im[1][2].each do |method| %>
 <li><%= method %></li>
 <% end %>
 </ul>
 </dd>
 </dl>
 </li>
<% end %>
</ul>


上記のコントローラーとヴューを作成し実行したところ、一見全ての
継承クラスとinclude済みモジュールのメソッドが表示されるのですが、
「render」と名のつくメソッドが一つも表示されません。
(ブラウザの検索ツールにて確認)
コードに間違いがあると思うのですが、自分では分からないので、
何かヒントでも良いのでご教示ください。
また、APIを調べるのに使い勝手の良いと思われるウェブサイトも
紹介してもらえると嬉しいです。

環境:
OS:Windows7
ruby 1.9.3p194
Rails 3.2.8

よろしくお願いします。


 		 	   		  

[前][次][番号順一覧][スレッド一覧]

->    3842 2012-10-15 04:43 [somohan@h...        ] renderメソッドの定義場所が分かりません  
      3843 2012-10-15 13:20 ┣[dezawa@a...         ]                                       
      3844 2012-10-15 13:55 ┃┗[somohan@h...        ]                                     
      3845 2012-10-19 08:14 ┗[ochi@c...           ]