zargony.com

#![desc = "Random thoughts of a software engineer"]

Edge Rails and gettext: undefined method file_exists? (NoMethodError)

After updating to the latest edge Rails via SVN today, my local development webserver suddenly started to respond with a 500 application error for every request. The mongrel console revealed:

NoMethodError (undefined method `file_exists?' for #<ActionView::Base:0x2aaaac3eee10>):
    /usr/lib64/ruby/gems/1.8/gems/gettext-1.90.0/lib/gettext/rails.rb:280:in `render_file'
    /usr/lib64/ruby/gems/1.8/gems/gettext-1.90.0/lib/gettext/rails.rb:278:in `each'
    /usr/lib64/ruby/gems/1.8/gems/gettext-1.90.0/lib/gettext/rails.rb:278:in `render_file'
    /vendor/rails/actionpack/lib/action_controller/base.rb:1107:in `render_for_file'
    /vendor/rails/actionpack/lib/action_controller/base.rb:841:in `render_with_no_layout'
    :
    :

Digging deeper, I found out that the method ActionView::Base#file_exists? has been moved to a different place in Rails' Changeset 8683. Fortunately, fixing it is easy.

As a workaround until either rails or gettext is fixed, you can simply drop the following lines somewhere into your rails application (e.g. I added it to config/initializers/gettext.rb, which I use to pull in gettext support):

module ActionView
  class Base
    delegate :file_exists?, :to => :finder unless respond_to?(:file_exists?)
  end
end

This snippet adds the method file_exists? to ActionView::Base if it doesn't exist and delegates calls to it to the finder (which is the place where this method has been moved to in newer rails versions).

Update: Issue reported as ruby-gettext bug #17990.

Update 2008-06-18: In a recent commit, the ActionView::Base#file_exists? method was added again, so the above workaround isn't necessary anymore for Edge Rails and probably Rails 2.1.

Update 2008-08-07: Looks like something was changed again before Rails 2.1 was released. With Rails 2.1, this workaround is still necessary to use gettext.