我正在尝试设置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。
答案 0 :(得分:6)
与维基百科的代码相比,在您的粘贴代码中仔细查看非常, 非常 。事实上,我建议执行两者的差异。
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
你看到了区别吗? Metamethods in Lua始终以两个下划线__
开头,而不是一个。我不确定你的代码是如何进入它所处的状态的,但这很好地解释了你所遇到的所有麻烦,甚至为什么attr
无法访问。这是由于metatable的__index
字段缺少下划线,这当然意味着它根本不会被识别。我很惊讶,因为在浏览时很容易错过额外的下划线。
我建议您首先将HtmlBuilder
模块恢复到原始状态,然后查看是否可以解决您的问题。您可能希望恢复NavBox
以及您可能已修改的任何其他内容,如果您的修改不是太重要,但diff 肯定会告诉您版本之间有何不同
请注意您将来的变化,但只要您有备份就不要害怕尝试!
答案 1 :(得分:3)
让我说,尝试回答你的问题非常困难。在原帖中,你没有说太多帮助解决问题。我将基于你提到的这行代码:
function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0) .addClass('nowraplinks') .addClass(args.bodyclass)
我可能会尝试将其替换为:
function renderMainTable() local tbl = HtmlBuilder.create('table')