QA@IT

Rubyのリファレンスの見方

2534 PV

現在RailsとRubyの勉強をしているのですが、リファレンスが読めなくて困っています。
というのもRubyは型が宣言されてないので、手元にあるインスタンスのメソッドの使い方がわからないのです。
具体的に、今悩んでいる事を例に使って、説明させていただきます。

現在やりたい事はRailsをつかって、送られてきたファイルをputsでコンソールに表示させたいです。
コントロール側のソースはこうなっています

# coding: UTF-8



p params[:file].read
#このソース自体はコピペです

しかしこの出力結果では文字化けしてしまいました(fileの中身には日本語が入っています)

私の予想としてはreadになんらかの引数を与える事で文字コードを指定できるのではないかと予想しました。
そこで中に何のクラスのインスタンスが入っているかを知りたいため、このようにソースを変更しました。

p params[:file].class

この結果、

ActionDispatch::Http::UploadedFile

というクラスがはいっていることがわかりました。

そこでActionDispatch::Http::UploadedFileでググってリファレンスを見つけました。

http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html

しかし特に説明が書いていません。
ソースをみると

def read(*args)
  @tempfile.read(*args)
end

とかいてあり、どうやら @tempfileというメンバ変数をラップしているようです。
しかし私には@tempfileは何のクラスのインスタンスか判断できません。

ここまでが実際に困ったことです。私は元々JavaやC#の出の人間なので、宣言時の型をみて対象のリファレンスを読むという方法しかわからないのですが、rubyでは今回のようなインスタンスに何のクラスが入っているかわからない事が多く、どんなメソッドが提供されているのか判断に苦しむことが多いです。

皆さんはこのような問題に出会った場合どのように解決されるのでしょうか?

  • 編集ボタンを押して、コード部分を
    ```ruby

    ```
    で区切っていただけますか。
    -

回答

pryを使うと、ブレイクポイントを設置して対話的にデバッグができるようになります。

まず、開発環境だけでロードされるように

gem 'pry', :group => :development

bundle installしておいて、ブレイクポイントを貼りたいところ(コントローラの受信処理をしているところ)に

binding.pry

と書いておき、送信を実行します。すると、サーバがその行で停止し、ターミナル上でのサーバコンソールがプロンプトを出しているはずです。そこでは自由にローカル変数にアクセスできるので、params[:file].tempfileparams[:file].tempfile.classなどと叩いていけば、これがTempfileのインスタンスだとわかります。

そこで、

> show-doc Tempfile#path

などと叩くと、

From: /Users/your_name/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/tempfile.rb @ line 246:
Number of lines: 2
Owner: Tempfile
Visibility: public
Signature: path()

Returns the full path name of the temporary file.
This will be nil if #unlink has been called.

のようにして、リファレンスとともに、ソースコードのファイル位置や行番号まで教えてくれます。

他にもpryはいろんなことができるので、 http://railscasts.com/episodes/280-pry-with-rails をじっくり見て参考にされることをおすすめします。

あと、どうせならrails consoleもpry対応にしてしまいたければ、

gem 'pry-rails', :group => :development

とやってしまうのもいいでしょう。

ただ実際には、rubyのエコシステムは進化が速く、どんどんコードが量産されるかわりにドキュメントが不足してることが多い傾向にあります。これは、ひとつにはruby自体が簡潔明瞭に書けるため、英語の文章で説明文を書くのとrubyのソースコードとの間にあまり可読性に差がない、ということもあるかと思います。

そのため、実際にはソースコードを直接見に行ったほうが早いことも少なくありません。

そこでおすすめなのは、gem-browsegem-openなどのツールです。これらを入れておくと、

gem open bitwise

などとやるだけで、該当のgemのソースツリーをEDITORで開くことができるようになります。

編集 履歴 (1)
  • こんな素晴らしいツールがあったとは・・・。おかげさまで解決できました。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。