読者です 読者をやめる 読者になる 読者になる

Ruby on Rails勉強会に参加してきた

知り合いのid:gutch01が勤務しているクレオフーガさんでRuby on Railsの勉強会が開催されたので参加してきました。勉強会と言っても知り合いの知り合いが集まってRubyネタを話す情報交換会みたいなアットホームな雰囲気の会でした。その時私が話をした内容を復習がてらメモしておきます。

Ruby技術者認定試験

先日のブログとほぼ同等のことです。
http://d.hatena.ne.jp/tech-kazuhisa/20100304

標準クラスの拡張

irb(main):001:0> class String
irb(main):002:1>   def say
irb(main):003:2>     "hello!"+self.to_s
irb(main):004:2>   end
irb(main):005:1> end
=> nil
irb(main):009:0> a = "kazuhisa"
=> "kazuhisa"
irb(main):010:0> a.say
=> "hello!kazuhisa"
irb(main):011:0>

てな感じでStringクラスを拡張できます。同様の手法でRailsではStringにblank?メソッドが追加されています。

特定のオブジェクトにメソッドを追加する

irb(main):001:0> module Hoge
irb(main):002:1>   def say
irb(main):003:2>     "hello!"+self.to_s
irb(main):004:2>   end
irb(main):005:1> end
=> nil
irb(main):006:0> a = "kazuhisa"
=> "kazuhisa"
irb(main):007:0> b = "gucchi"
=> "gucchi"
irb(main):008:0> a.extend(Hoge)
=> "kazuhisa"
irb(main):009:0> a.say
=> "hello!kazuhisa"
irb(main):010:0> b.say
NoMethodError: undefined method `say' for "gucchi":String
        from (irb):10
irb(main):011:0>

クラスに対しての機能追加ではなく、作成されたオブジェクトに機能を後から追加できるのがミソ。

ruby-debug

ruby-debugを使用するとCUIベースながらVisual StudioEclipseみたいなブレークポイントを置いてのステップ実行ができます。
まずはgemを使用してインストールしましょう。

gem install ruby-debug

railsを起動する際にデバッグオプションをつけて起動しましょう。

ruby script/server -u

ソース中の停止したい場所に「debugger」の文字を入れましょう。

  def recomendedby
    debugger
    @user = User.find_by_name(params[:name])
    if @user.nil?
      #ユーザーが見つからない場合。後で共通エラー画面に飛ばす
      redirect_to :controller => 'main'
      return
    end

debuggerを埋め込んだ箇所にさしかかると処理が一時的に停止します。
コマンドラインで動作を確認しながらステップ実行することができます。

n:次の行に進む
l:現在行の周辺を表示する
c:一気に進める

他にも色々コマンドがあるのでruby-debugでググッて調べてみましょう。

yield

yieldを使うとスコープが狭くなっていいよね。

irb(main):001:0> def say
irb(main):002:1>   yield "hello!"
irb(main):003:1> end
=> nil
irb(main):004:0> say do |x|
irb(main):005:1*   puts x
irb(main):006:1> end
hello!
=> nil

block_given?を使うとopenみたいに通常の戻り値とブロックを判別することができます。

irb(main):001:0> def say
irb(main):002:1>   if block_given?
irb(main):003:2>     yield "hello!"
irb(main):004:2>   else
irb(main):005:2*     "hello!"
irb(main):006:2>   end
irb(main):007:1> end
=> nil
irb(main):008:0> say
=> "hello!"
irb(main):009:0> say do |x|
irb(main):010:1*   puts x
irb(main):011:1> end
hello!
=> nil

次回

次回はmemcachedrailsの連携について話せたらいいなー。