It’s been a while - 5 years apparently but from memory…
The job code, for example:
# school-points\jobs\deferred_topic_creation.rb
module Jobs
class DeferredTopicCreation < Jobs::Base
def execute(args)
creator_user_id = args[:creator_user_id]
custom_fields = {
event_start: args[:event_start],
event_end: args[:event_end]
}
creator_user = User.find(creator_user_id) || User.find(Discourse::SYSTEM_USER_ID)
post_creator = PostCreator.new(
creator_user,
args.except!(:creator_user_id, :event_start, :event_end)
)
post = post_creator.create
topic = Topic.find(post.topic_id)
topic.custom_fields = custom_fields
topic.save!
end
end
end
should be LOADED in the after_initialize block. If this is not done, then the job can not be created. This does not create a topic, instead it simply registers the code as a job that can be enqueued later.
Then, when you actually want to do deferred creation of a topic (for you this is after your AJAX request), you would execute something like this:
opts = {
title: title,
raw: content,
category: child_category[:id],
creator_user_id: creator_user_id,
event_start: event_start.to_time.to_i,
event_end: event_end.to_time.to_i
}
Jobs.enqueue(:deferred_topic_creation, opts)
I hope that makes things clearer.