【发布时间】:2010-02-11 22:22:35
【问题描述】:
尽管我很想,但我仍然不知道如何实现元编程。
对于从我的 Admin::Base 控制器呈现的视图,我想覆盖位于 ActionView::Helpers::AssetTagHelper 下的 Rails compute_public_path,这样我所有管理员的布局文件都将位于 public/admin 下。
可能有更好的方法,但现在我想学习如何做到这一点。
我把它放在 Admin::Base 控制器中:
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
我得到“模块'AdminHelper'的未定义方法'compute_public_path'”,我猜这是因为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 为我指明了正确的方向。
如何通过禁用类缓存来完成这项工作?
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming