トップ «前の日記(2006-01-06) 最新 次の日記(2006-01-09)» 編集

3 日坊主日記


2006-01-07 [長年日記]

_ [Rails] ActionView::Base method_names の衝突

ActionView::Base.new に渡す base_path は自由に設定できるように見えるが、実際にはあるひとつのパスしか使ってはいけない。というのは @@method_names を使ったテンプレートキャッシュの仕組みがあるからだ。

あるふたつの、パスは異なるが同名のテンプレートファイルがあるとする。ここでは x/edit y/edit としよう。

   output = ActionView::Base.new("#{RAILS_ROOT}/app/views/x", "entry" => @entry).render_file("edit")
   output = ActionView::Base.new("#{RAILS_ROOT}/app/views/y", "entry" => @entry).render_file("edit")

これはまずい。これを連続して呼び出すとテンプレートファイル y/edit は使われずに x/edit が使われる。

これは @@method_names の値を作る assign_method_name が (結果的に) 相対パスを基にすることが原因だ。

ただし、例外が飛んだときのトレースには正しく y/edit のテンプレートが使われるので、デバッグしようとして混乱する (この挙動で気づいたわけだけど^^;)。

なので

   output = ActionView::Base.new("#{RAILS_ROOT}/app/views", "entry" => @entry).render_file("x/edit")
   output = ActionView::Base.new("#{RAILS_ROOT}/app/views", "entry" => @entry).render_file("y/edit")

こう書くことになる。

[]