媒体维基上的 Lua 错误

我试图设置一个MediaWiki,尝试使用Navbox模板。我在本地机器上一切都正常,但是当我将它全部复制到服务器上时,我得到Lua脚本错误,具体而言:

Lua error at line 302: attempt to call field 'attr' (a nil value).
Backtrace:
(tail call): ?
Module:Navbox:302: in function "renderMainTable"
Module:Navbox:348: in function "renderMainTable"
(tail call): ?
mw.lua:425: ?
(tail call): ?
[C]: in function "xpcall"
MWServer.lua:73: in function "handleCall"
MWServer.lua:266: in function "dispatch"
MWServer.lua:33: in function "execute"
mw_main.lua:7: in main chunk
[C]: ?

如果我编辑该文件,那么所有其他字段就会出现错误。

如果我的服务器运行的是MediaWiki 1.20,是否会有所不同。我尝试了Scribunto 1.20、1.21和master(根据1.20进行了更改)。

如果有人能帮忙,那太好了。

编辑过的模块:Navbox、HtmlBuilder。

点赞
用户2988979
用户2988979

让我说一下,尝试回答你的问题非常困难。在原始帖子中,你并没有提供解决问题所需的许多信息。我只能根据你提到的这行代码来回答:

function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0) .addClass('nowraplinks') .addClass(args.bodyclass)

我可能会尝试用这个替换它:

function renderMainTable() local tbl = HtmlBuilder.create('table')
2013-11-17 17:15:26
用户828255
用户828255

非常仔细地查看您的 pastebin 代码与维基百科的代码进行比较。实际上,我建议对两者进行 diff。

您的代码

metatable._index = function(t, key)
    local ret = rawget(t, key)
    if ret then
        return ret
    end

    ret = metatable[key]
    if type(ret) == 'function' then
        return function(...)
            return ret(t, ...)
        end
    else
        return ret
    end
end

维基百科

metatable.__index = function(t, key)
    local ret = rawget(t, key)
    if ret then
        return ret
    end

    ret = metatable[key]
    if type(ret) == 'function' then
        return function(...)
            return ret(t, ...)
        end
    else
        return ret
    end
end

您看到了区别吗?在 Lua 中,元方法始终以两个下划线 __ 开头,而不是一个。我不确定您的代码是如何达到当前状态的,但这可以很好地解释您所遇到的所有问题,甚至解释为什么 attr 无法访问。原因在于元表的 __index 字段缺少下划线,这当然意味着它根本不会被识别。即使是在阅读时,也很容易忽略掉那个额外的下划线。

我建议首先将您的 HtmlBuilder 模块还原到其原始状态,然后查看是否解决了您的问题。如果您修改的内容不太重要,您可能需要恢复 NavBox 和其他一些内容,但是 diff 绝对会告诉您版本之间的差异。

只要有备份,就请谨慎更改未来要更改的内容,但不要害怕进行实验!

2013-11-19 14:30:00