أواجه الخطأ التالي عند تشغيل سكريبت الاستيراد لـ muut:
استيراد الفئات
2 / 2 (100.0%) [5170854 عنصر/دقيقة]
استيراد المناقشات
تتبع (آخر استثناء):
8: من script/import_scripts/muut.rb:184:in `<main>'
7: من /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
6: من script/import_scripts/muut.rb:25:in `execute'
5: من script/import_scripts/muut.rb:82:in `import_discussions'
4: من script/import_scripts/muut.rb:82:in `each'
3: من script/import_scripts/muut.rb:84:in `block in import_discussions'
2: من script/import_scripts/muut.rb:84:in `each'
1: من script/import_scripts/muut.rb:110:in `block (2 levels) in import_discussions'
script/import_scripts/muut.rb:162:in `process_muut_post_body': لا توجد طريقة `gsub!' لـ nil:NilClass (NoMethodError)
هل يمكن لأي شخص توجيهي نحو الحل الصحيح لتجاوز هذا الخطأ؟
# frozen_string_literal: true
require "csv"
require File.expand_path(File.dirname(__FILE__) + "/base.rb")
# عدّل الثوابت وطريقة التهيئة (`initialize`) لتناسب بيانات الاستيراد الخاصة بك.
class ImportScripts::Muut < ImportScripts::Base
JSON_FILE_PATH = "/path/to/json/file"
CSV_FILE_PATH = "/path/to/csv/file"
def initialize
super
@imported_users = load_csv
@imported_json = load_json
end
def execute
puts "", "جاري الاستيراد من Muut..."
import_users
import_categories
import_discussions
puts "", "تم"
end
def load_json
JSON.parse(repair_json(File.read(JSON_FILE_PATH)))
end
def load_csv
CSV.parse(File.read(CSV_FILE_PATH))
end
def repair_json(arg)
arg.gsub!(/^\(/, "") # محتوى الملف محاط بـ ( )
arg.gsub!(/\)$/, "")
arg.gsub!(/\]\]$/, "]") # قد يكون هناك قوس معقوف إضافي في النهاية
arg.gsub!(/\}\{/, "},{") # أحيانًا ينقص الفواصل!
arg.gsub!("}]{", "},{") # قوس معقوف مفاجئ
arg.gsub!("}[{", "},{") # :troll:
arg
end
def import_users
puts '', "جاري استيراد المستخدمين"
create_users(@imported_users) do |u|
{
id: u[0],
email: u[1],
created_at: Time.now
}
end
end
def import_categories
puts "", "جاري استيراد الفئات"
create_categories(@imported_json['categories']) do |category|
{
id: category['path'], # لا يحتوي muut على معرف للفئات، لذا نستخدم المسار
name: category['title'],
slug: category['path']
}
end
end
def import_discussions
puts "", "جاري استيراد المناقشات"
topics = 0
posts = 0
@imported_json['categories'].each do |category|
@imported_json['threads'][category['path']].each do |thread|
next if thread["seed"]["key"] == "skip-this-topic"
mapped = {}
mapped[:id] = "#{thread["seed"]["key"]}-#{thread["seed"]["date"]}"
if thread["seed"]["author"] && user_id_from_imported_user_id(thread["seed"]["author"]["path"]) != ""
mapped[:user_id] = user_id_from_imported_user_id(thread["seed"]["author"]["path"]) || -1
else
mapped[:user_id] = -1
end
# تحديث اسم العرض للمستخدم
if thread["seed"]["author"] && thread["seed"]["author"]["displayname"] != "" && mapped[:user_id] != -1
user = User.find_by(id: mapped[:user_id])
if user
user.name = thread["seed"]["author"]["displayname"]
user.save!
end
end
mapped[:created_at] = Time.zone.at(thread["seed"]["date"])
mapped[:category] = category_id_from_imported_category_id(thread["seed"]["path"])
mapped[:title] = CGI.unescapeHTML(thread["seed"]["title"])
if thread["seed"]["body"] == ""
thread["seed"]["body"] = " ";
end
mapped[:raw] = process_muut_post_body(thread["seed"]["body"])
mapped[:raw] = CGI.unescapeHTML(thread["seed"]["title"]) if mapped[:raw] == ""
parent_post = create_post(mapped, mapped[:id])
unless parent_post.is_a?(Post)
puts "خطأ في إنشاء الموضوع #{mapped[:id]}. تم التجاوز."
puts parent_post.inspect
end
# قم بإلغاء التعليق عن السطر أدناه لإنشاء رابط دائم
# Permalink.create(url: "#{thread["seed"]["path"]}:#{thread["seed"]["key"]}", topic_id: parent_post.topic_id)
# إنشاء الردود
if thread["replies"].present? && thread["replies"].count > 0
thread["replies"].reverse_each do |post|
if post_id_from_imported_post_id(post["id"])
next # تم استيراد هذا المنشور بالفعل
end
if post["body"] == ""
post["body"] = " "
end
new_post = create_post({
id: "#{post["key"]}-#{post["date"]}",
topic_id: parent_post.topic_id,
# عدّل السطر التالي للحصول على معرف المستخدم الفريد من قيمة author/path.
user_id: user_id_from_imported_user_id(post["author"]["path"]) || -1,
raw: process_muut_post_body(post["body"]),
created_at: Time.zone.at(post["date"])
}, post["id"])
if new_post.is_a?(Post)
posts += 1
else
puts "خطأ في إنشاء المنشور #{post["id"]}. تم التجاوز."
puts new_post.inspect
end
end
end
topics += 1
end
end
puts "", "تم استيراد #{topics} مواضيع مع #{topics + posts} منشور."
end
def process_muut_post_body(arg)
raw = arg.dup
raw = raw.to_s
raw = raw[0..-1]
# سطر جديد
if raw != nil
raw.gsub!(/\\n/, "\n")
# كتلة كود
raw.gsub!("---", "```\n")
# تبويب
raw.gsub!(/\\t/, ' ')
# علامة اقتباس مزدوجة
raw.gsub!(/\\\"/, '"')
raw = CGI.unescapeHTML(raw)
end
raw
end
def file_full_path(relpath)
File.join JSON_FILES_DIR, relpath.split("?").first
end
end
if __FILE__ == $0
ImportScripts::Muut.new.perform
end