Как бы мне ни хотелось, я до сих пор не знаю, как реализовать метапрограммирование.
Для представлений, отображаемых с моего контроллера Admin :: Base, я бы хотел переопределить Rails compute_public_path
, расположенный в ActionView :: Helpers :: AssetTagHelper, чтобы все файлы макетов моего администратора были в public / admin.
Возможно, есть лучший способ для этого, но сейчас я хочу научиться делать это таким образом.
Я положил это в Admin :: Базовый контроллер:
module ActionView::Helpers::AssetTagHelper
def compute_public_path(source, dir, ext = nil, include_host = true)
super(source, "admin/#{dir}", ext = nil, include_host = true)
end
end
но это дает мне:
super: no superclass method `compute_public_path' for #<ActionView::Base:0x1032240a8>
Что меня не удивляет.
Если я попробую это в моем помощнике администратора:
def compute_public_path_with_admin(source, dir, ext = nil, include_host = true)
compute_public_path_without_admin(source, "admin/#{dir}", ext, include_host)
end
alias_method_chain :compute_public_path, :admin
Я получаю "неопределенный метод 'compute_public_path' для модуля 'AdminHelper'", что, как я предполагаю, происходит потому, что compute_public_path
- это закрытый метод.
Я нашел это работает:
ActionView::Helpers::AssetTagHelper.class_eval do
def compute_public_path_with_admin(source, dir, ext = nil, include_host = true)
compute_public_path_without_admin(source, "admin/#{dir}", ext, include_host)
end
alias_method_chain :compute_public_path, :admin
end
, пока я устанавливаю config.cache_classes
в false
, в противном случае я получаю слишком большую ошибку на уровне стека.
Спасибо Squeegy за указание в правильном направлении.
Как я могу заставить эту работу отключить кэширование классов?