Bei der Durchsicht von yahoogroup.rb zeigt sich eindeutig, dass das From-Feld in der Nachricht eine reine E-Mail-Adresse erwartet. Da die meisten Benutzer ihre E-Mail-Clients so konfigurieren, dass sie auch einen Namen senden (z.
B.
Fred Flintstone <fred@flintstone.com>
), ist dies Problem Nr. 1. Eine kurze Google-Suche legt nahe, dass dies mit dem Mail-Gem behoben werden kann, was die entsprechende Zeile im Import-Skript so ändern würde:
email: Mail::ToField.new(user_info["ygData"]["from"]), # erforderlich
…was nur die E-Mail-Adresse extrahieren würde. Wie oben erwähnt, werden die spitzen Klammern jedoch stattdessen als HTML-Entitäten gespeichert, was diese Methode zum Scheitern bringt. Weitere Google-Suchen verraten mir, dass es ein HTMLEntities-Gem gibt, das dies erledigen würde, was mich zu diesem Versuch veranlasst:
email: Mail::ToField.new(HTMLEntities.new.decode(user_info["ygData"]["from"])), # erforderlich
Dies schlägt jedoch fehl, da die Methode downcase fehlt.
Edit: Ich habe versucht, dies zu umgehen, indem ich einen anderen Weg gewählt habe; ich habe viele Vorschläge für Nokogiri gesehen. Aber so nützlich es auch ist, die gefundenen Vorschläge dekodierten die spitzen Klammern-Entitäten nicht, was (und ist) mein dringendstes Bedürfnis war. Also zurück zu HTMLEntities. Ich habe require 'mail' und require 'htmlentities' an den Anfang des Yahoo-Import-Skripts hinzugefügt und Zeile 75 (vor dem Hinzufügen der Requires war es Zeile 73) so geändert, wie oben beschrieben. Ich erhalte weiterhin einen Fehler, aber was ich zuvor übersehen habe, ist, dass tatsächlich ein Benutzer korrekt analysiert und importiert wird, bevor das Skript abstürzt:
dan@ubuntu:~/discourse$ bundle exec ruby script/import_scripts/yahoogroup.rb
Lade bestehende Gruppen...
Lade bestehende Benutzer...
Lade bestehende Kategorien...
Lade bestehende Beiträge...
Lade bestehende Themen...
(snip)
Verbunden mit der Datenbank....
Importiere aus Mongodb....
Importiere Benutzer
Benutzer erstellt: user@host.tld
Traceback (most recent call last):
8: from script/import_scripts/yahoogroup.rb:163:in `<main>'
7: from /home/dan/discourse/script/import_scripts/base.rb:47:in `perform'
6: from script/import_scripts/yahoogroup.rb:39:in `execute'
5: from script/import_scripts/yahoogroup.rb:58:in `import_users'
4: from /home/dan/discourse/script/import_scripts/base.rb:247:in `create_users'
3: from /home/dan/discourse/script/import_scripts/base.rb:247:in `each'
2: from /home/dan/discourse/script/import_scripts/base.rb:259:in `block in create_users'
1: from /home/dan/discourse/script/import_scripts/base.rb:290:in `create_user'
/home/dan/discourse/script/import_scripts/base.rb:385:in `find_existing_user': undefined method `downcase' for #<Mail::ToField:0x00005575597e63b8> (NoMethodError)
(Die E-Mail-Adresse in dieser Ausgabe ist maskiert, befindet sich aber in der Quelldatenbank mit dem vollständigen Namen und den Entitäten für die spitzen Klammern – es scheint also, dass meine Änderungen am Skript genau die gewünschte Wirkung hatten). Das verwirrt mich ein wenig, da ich dachte, downcase sei standardmäßig verfügbar.
Edit 2: Nun, es analysiert den Benutzer, importiert ihn aber tatsächlich nicht in die Discourse-Instanz.