задний план
Я пытаюсь перенести старое приложение 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
?