gpt4 book ai didi

ruby-on-rails - 如何通过元编程覆盖 Ruby on Rails 模块方法?

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:25 25 4
gpt4 key购买 nike

尽管我很想知道如何实现元编程。

对于从我的 Admin::Base Controller 呈现的 View ,我想覆盖位于 ActionView::Helpers::AssetTagHelper 下的 Rails compute_public_path,这样我所有的管理员布局文件都将在 public/admin 下.

可能有更好的方法,但现在我想学习如何以这种方式做到这一点。

我把它放在 Admin::Base Controller 中:

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 是私有(private)方法。

我发现这个有效:

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为我指明了正确的方向。

如何在禁用类缓存的情况下进行这项工作?

最佳答案

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 现在将调用您的实现,然后调用原始实现。

参见:Is alias_method_chain synonymous with alias_method?

关于ruby-on-rails - 如何通过元编程覆盖 Ruby on Rails 模块方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com