Lua ошибка на MediaWiki
Я пытаюсь настроить 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.
2 ответа
Посмотрите очень, очень внимательно на ваш вставленный код по сравнению с кодом Википедии. На самом деле, я бы порекомендовал провести различие между ними.
Ваш код
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 определенно скажет вам, что отличается между вашими версиями.
Просто помните о том, что вы измените в будущем, но не бойтесь экспериментировать, пока у вас есть резервные копии!
Позвольте мне сказать, что очень трудно попытаться ответить на ваш вопрос. В оригинальном посте вы не говорите много, что поможет решить проблему. Я просто воспользуюсь этой строкой кода, которую вы упомянули:
function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0) .addClass('nowraplinks') .addClass(args.bodyclass)
Я, вероятно, попытался бы заменить это следующим:
function renderMainTable() local tbl = HtmlBuilder.create('table')