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

rails:3337

From: Shinya Kawaji <kawaji@g...>
Date: Fri, 11 Dec 2009 15:13:52 +0900
Subject: [rails:3337] Re: テスト時や development 環境の時のみシステム時刻を強制したい

かわじ、です。

# 本質の話ではなく、蛇足です


> 例えば config/environment.rb に以下の記述をしてみました。
> 	require 'date'
> 	class Date
> 	  def self.today
> 	    RAILS_ENV == 'production' ? Date.today : Date.new(2009,10,1)
> 	  end
> 	end
> 
> #ただ、これだと production 環境で実行したら「SystemStackError: stack level too deep」
> #が出てしまいました。
> #(エラーが出ないように、本当の Date.today をコールするにはどうしたら良いですか?)

再定義の場所の話ではなく、単に コードの書き方になりますが、

上記のコードでは RAILS_ENV == 'production' であるときに(現在再定義中の)
Date.today をそのまま呼んでいますので、同じメソッドをまた呼ぶことになり、
無限再帰します。

やりたいことは

  オリジナルの Date.today と、テスト用に定義した Date.today を使い分ける

ことなので、いったん「オリジナルの Date.today」を待避させる必要がありま
す。

RubyOnRailsでは、こういう時のための Module#alias_method_chain という仕組
みがあり、上記コードは

require 'date'
class << Date
  def today_with_development
    RAILS_ENV == 'production' ?
      Date.today_without_development : Date.new(2009,10,1)
  end
  alias_method_chain :today, :development
end

と書けます (クラスメソッドなので、class << Date としています)。

こうすると、config/environment.rb に定義されていても、意図通りに動作する
と思います。


今回の話としては、別の解決策のほうがより本質的な解決だと思いますが、
上記のような方法があることを知っておくことも、RubyOnRailsでの開発では
有用になると思います。


--
ML: rails@r...
使い方: http://QuickML.com/

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

      3330 2009-12-11 04:09 [naopontan@g...      ] テスト時や development 環境の時のみシステム時刻を強制したい
      3331 2009-12-11 04:27 ┣[fuj@r...            ]                                       
      3332 2009-12-11 06:43 ┃┗[naopontan@g...      ]                                     
      3333 2009-12-11 06:48 ┃ ┣[okkez000@g...       ]                                   
      3335 2009-12-11 06:55 ┃ ┃┣[okkez000@g...       ]                                 
      3339 2009-12-11 07:22 ┃ ┃┗[naopontan@g...      ]                                 
      3334 2009-12-11 06:52 ┃ ┣[fuj@r...            ]                                   
      3338 2009-12-11 07:18 ┃ ┃┗[naopontan@g...      ]                                 
      3341 2009-12-11 10:08 ┃ ┃ ┗[fuj@r...            ]                               
      3342 2009-12-11 10:53 ┃ ┃  ┗[naopontan@g...      ]                             
      3336 2009-12-11 07:09 ┃ ┣[shigi@s...          ]                                   
->    3337 2009-12-11 07:13 ┃ ┗[kawaji@g...         ]                                   
      3340 2009-12-11 07:20 ┃  ┗[naopontan@g...      ]                                 
      3343 2009-12-11 23:39 ┗[zn@m...             ]