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... ]