Миграция приложения Rails 2 в Rails 3: `image_path` выдает неопределенную локальную переменную или метод 'config'

задний план

Я пытаюсь перенести старое приложение Rails 2 (Ruby 1.8.7) на Rails 3.0.9 (Ruby 1.9.3) — да, это ступенька для перехода на Rails 4 и Ruby 2.2 — и я наткнулся на следующее проблема.

В оригинальном приложении широко используется старый Active Form драгоценный камень, который мы немного изменен для поддержки Ruby 1.9.

В основном это работает, но, похоже, есть некоторые проблемы с тем, как он взаимодействует с ActionView::Helpers::AssetTagHelper, который является частью ActionPack 3.0.9.

В моем конкретном случае у меня есть ActiveForm::DateCalendarSection (построенный динамически), который является подклассом ActiveForm::Element::Section, который, согласно self.class.ancestors, является подклассом ActionView::Helpers::AssetTagHelper< /а>. Глядя на источник ActiveForm, однако, нет упоминания о AssetTagHelper или asset_tag_helper, поэтому то, как они на самом деле связаны, остается для меня загадкой.

Проблема

Вызовы метода image_path приводят к ошибке

undefined local variable or method 'config'

Вызов image_path — это просто оболочка вокруг вызова compute_public_path. в 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

Погружаясь в это с binding.pry, становится очевидным, что config действительно не определено. Точно так же controller также не определено.

Вопрос

Что изменилось между Rails 2 и Rails 3, например, методы из ActionView::Helpers::AssetTagHelper больше не могут обращаться к Rails config или текущему controller?


person Dave Sag    schedule 27.08.2015    source источник


Ответы (1)


Возможно, у вас недостаточно загруженной поддержки Rails. Может быть, втянуть все в свой драгоценный камень с помощью

require "active_support/all"

В качестве альтернативы посмотрите, как современные Rails подключаются через прокси к конфигурации:

https://github.com/rails/rails/pull/12622/files

person user1643461    schedule 27.08.2015