There have been multiple bug reports for the events plugin in the last two days that all seem to be type-casting issues with custom fields. The events plugin hasn’t been substantively updated in a few months.
The plugin.rb file casts event_start as an integer:
def has_event?
self.custom_fields['event_start']&.nonzero?
end
The error itself follows this format:
NoMethodError (undefined method `nonzero?' for [1563127206, 1563127206]:Array)
As far as I understand register_custom_field_type it should ensure that the custom_field always returns as the defined type (perhaps I’m misunderstanding it).
Looking at the has_custom_fields.rb concern, there have been a few changes in the past week that could have affected this, in particular
Yes, it’s cropped up a few times in the past. This latest rash seems to coincide with recent work on the has_custom_fields.rb concern, so there may be something to review there.
This doesn’t fix it, but helps to address it if it arises:
Meine allgemeine Empfehlung als Plugin-Autor ist, dass Sie in einer Migration immer Indizes hinzufügen sollten, um die Einschränkung ordnungsgemäß durchzusetzen. Tatsächlich vermeiden die meisten Plugins, die wir heutzutage entwickeln, benutzerdefinierte Felder, es sei denn, sie sind absolut notwendig, und bevorzugen benutzerdefinierte Tabellen, die viel leichter zu verstehen sind. In diesem speziellen Fall benötigen Sie einen Index von:
create unique index idxStartEvent on topic_custom_fields(topic_id) where name = 'start_event'
Ich bin mir nicht sicher, was wir sonst noch im Core tun müssen. Wir haben eine Überarbeitung der benutzerdefinierten Felder in Betracht gezogen, sind jedoch etwas besorgt darüber. Eine Sache, die ich erwäge, ist, die Array-Unterstützung bei benutzerdefinierten Feldern einfach zu entfernen, da sie über die Jahre enorme Probleme verursacht haben.
Entschuldigt bitte das Aufwärmen dieses Threads, aber eine der Bedingungen tritt auf, wenn ihr einen Symbol-Index verwendet, also z. B. custom_fields[:hello]. Beim Aktualisieren eines bestehenden Werts wurde stattdessen ein weiteres Feld hinzugefügt, was zu einem Array führte. Meines Erachtens ist dies die einzige Bedingung.
Dies sollte den verursachten Seiteneffekt mit ziemlicher Sicherheit beheben.