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

rails:3340

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

naopontan です。

>  オリジナルの Date.today と、テスト用に定義した Date.today を使い分ける
> ことなので、いったん「オリジナルの Date.today」を待避させる必要がありま
> す。
> RubyOnRailsでは、こういう時のための Module#alias_method_chain という仕組
> みがあり、上記コードは...

勉強になります。この辺はモヤモヤしていた部分なのでスッキリしました。
ありがとうございます。

2009年12月11日15:13 Shinya Kawaji <kawaji@g...>:
> かわじ、です。
>
> # 本質の話ではなく、蛇足です
>
>
>> 例えば 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/
>

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