استيراد باستخدام muut.rb

مرحبًا،

أواجه الخطأ التالي عند تشغيل سكريبت الاستيراد لـ 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)

هل يمكن لأي شخص توجيهي نحو الحل الصحيح لتجاوز هذا الخطأ؟

حقل ما، وربما يكون بيانات المنشور، مفقود، ربما لأن السكربت يحاول الوصول إلى اسم حقل خاطئ.

إليك تحديث muut.rb الذي نجح معي:

# 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