【问题标题】:Displaying method to run after sometime using delayed job显示使用延迟作业一段时间后运行的方法
【发布时间】:2018-08-13 11:35:44
【问题描述】:

我是 ruby​​ 的新手,我有一个消息传递应用程序,每当用户在某个时间后发送消息时,它应该在 1 分钟后显示一条自动消息 我使用了延迟作业 gem 并在我的 app/job 文件夹中的 mailing_job.rb 中创建了一个执行方法 现在,当我的代码执行时,它可以正常工作,但它不会等待指定的延迟时间,而是在该时间本身执行。我的控制器中也创建了相同的方法,延迟方法语法使用的是控制器方法,而不是我的 mailin_job.rb 中的 perform 方法 这是我的消息控制器的 sn-p

def reply
    @message = MessageThread.new(message_params)
    @user2 = get_user(params[:id])
    save_message

    Mailing_Job.set(wait: 1.minute).perform_later()

    render 'material_admin/home.html.erb'
end

在我的 app/job/mailing_job.rb 文件中

class Mailing_Job < ActiveJob::Base
queue_as :default

 def perform()

    @auto_message = Setting.all[0]
    @body = @auto_message.body

end
end

config/application.rb 文件

config.active_job.queue_adapter = :delayed_job

chat_user_message 视图

<% @messages.each do |message| %>
<div class='right-message'>
  <div class='margin-bottom'>
    <span class='yellow'><%= message.body %></span>
  </div>
  <small>
    <%= message.created_at.strftime(" %I:%M %p") %>
  </small>
  <div>
    <small>
      <%= @body %>
    </small> </div>
</div>
<div class='left-message'>
  <div class='margin-bottom'>
    <span class='grey'><%= message.body %></span>
  </div>
  <small>
    <%= message.created_at.strftime(" %I:%M %p")%>
  </small>
</div>

谁能解释一下我做错了什么,提前谢谢

【问题讨论】:

  • “在 1 分钟后显示自动消息”您的意思是发送电子邮件?
  • 不,它在一个小 div 中显示在同一个聊天框上,它是一个实时聊天应用程序,所以每次用户发送消息时,我希望它显示一条自动消息,例如一分钟后发送的消息下面是他发送给@phoet的消息
  • 我真的不明白。为什么要将运行控制器方法automated_message 的结果传递到某个地方?它显然会运行,因为你调用它perform_later(automated_message) 调用它并将结果作为属性发送到perform_later。您真的需要 perform 方法的任何参数吗?你好像没用过。
  • 另外:你真的要复制这段代码吗?请注意,在您的 perform 方法中,您设置实例变量 @auto_messagebody 不是为您的控制器,而是为您的 Mailing_Job 类对象。您可能无法使用它们。 (也必须是MailingJob,没有_
  • 是的,我理解了那部分并更改了参数,我检查了我的日志并且 mailin_job 正在后台运行我希望@body 变量在执行 mailing_job 后显示在我的视图中我应该这样做吗?

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 delayed-job


【解决方案1】:

Delayed_job 在与 Rails 主应用程序不同的进程中运行,并且无法创建视图的任何部分。此外,一旦“回复”动作呈现,您的服务器会断开与客户端的连接,并且稍后在作业执行时无法联系它,除非您实现 Web Sockets 之类的东西。

一个更简单的选项可能是向视图添加一些 Javascript,以检查服务器上的另一个方法(例如每 15 秒)以查看作业是否已完成。它可以在检测到作业已完成时通知用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多