mercredi 26 août 2015

Migrating a Rails 2 app to Rails 3: `image_path` throws "undefined local variable or method 'config'"

background

I am trying to migrate an old Rails 2 (Ruby 1.8.7) app to Rails 3.0.9 (Ruby 1.9.3) — yes it's a stepping stone to get it to Rails 4 and Ruby 2.2 — and I've hit the following problem.

The original app makes extensive use of an old Active Form gem which we've hacked slightly to support Ruby 1.9.

It mostly works, but there appears to be some issue with how it interacts with the ActionView::Helpers::AssetTagHelper that's part of ActionPack 3.0.9.

In my specific case I have an ActiveForm::DateCalendarSection (built dynamically) which subclasses ActiveForm::Element::Section, which, according to self.class.ancestors, is a subclass of ActionView::Helpers::AssetTagHelper. Looking at the ActiveForm source however there is no mention of AssetTagHelper or asset_tag_helper so how they are actually connected remains a mystery to me.

Problem

Calls to the method image_path result in an error

undefined local variable or method 'config'

The call to image_path is simply a wrapper around a call to compute_public_path in ActionView::Helpers::AssetTagHelper

# File actionpack/lib/action_view/helpers/asset_tag_helper.rb, line 741
def compute_public_path(source, dir, ext = nil, include_host = true)
  return source if is_uri?(source)

  source += ".#{ext}" if rewrite_extension?(source, dir, ext)
  source  = "/#{dir}/#{source}" unless source[0] == //
  source = rewrite_asset_path(source, config.asset_path)

  has_request = controller.respond_to?(:request)
  if has_request && include_host && source !~ %{^#{controller.config.relative_url_root}/}
    source = "#{controller.config.relative_url_root}#{source}"
  end
  source = rewrite_host_and_protocol(source, has_request) if include_host

  source
end

Diving into that with binding.pry it's evident that config is indeed not defined. Likewise controller is also not defined.

Question

What would have changed between Rails 2 and Rails 3, such that methods from ActionView::Helpers::AssetTagHelper can no longer access Rails' config or the current controller?

Aucun commentaire:

Enregistrer un commentaire