Railsのクラス定数にからむ罠にハマる

Tsukasa OISHI

今日の失敗。
こんなmodelがあって

class Article < ActiveRecord::Base
  TITLE = "xxのブログ"

  def self.title
    TITLE
  end
.....
end

こんなhelperがあったとき

module ArticleHelper
  def title_link(str)
    name = Article.title
    name << str
    link_to h(name), article_path(....)
  end
end

viewでtitle_linkヘルパーが呼び出されるたびにリンク名がおかしなことになった。
1回目

<a href="..">xxのブログ aa</a>

2回目

<a href="..">xxのブログ aa bb</a>

3回目

<a href="..">xxのブログ aa bb cc</a>

Rubyは、破壊メソッドでなら定数でも警告なしに上書きできるんだけど、これによってArticle::TITLEがヘルパーを呼ぶたびに上書きされていた。
この部分。

  name << str

development環境では毎回ロードされるのでこのバグに気づかなくて、production環境でヒドいことになったのでした。