ActionView :: Template :: Error: неопределенный метод 'body' при использовании sidekiq для рендеринга трансляции ActionCable - PullRequest
0 голосов
/ 22 марта 2020

Я настраиваю ActionCable для работы с сообщениями моего приложения, и застрял в ошибке undefined method, которую я не понимаю.

При создании сообщения широковещательная передача ActionCable делегируется фоновому работнику:

model.rb

class Message < ApplicationRecord
 after_create_commit { MessageBroadcastWorker.perform_async self }
 validates :body, presence: true
end

message_broadcast_worker .rb

class MessageBroadcastWorker
 include Sidekiq::Worker

 def perform(message)
  ActionCable.server.broadcast('messages_channel', message: render_message(message))
 end

 private
  def render_message(message)
   ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
  end
end

На странице индекса сообщений отображаются все сообщения в беседе:

index. html .erb

<%= render @messages %>

_message. html .erb:

<% cache message do %>
  <div><%= message.body %></div>
<% end %>

Но я получаю эту ошибку:

2020-03-22T16:41:01.733Z pid=597 tid=owznmnngh class=MessageBroadcastWorker jid=11d9da030dd20e89cd6c774e INFO: start
2020-03-22T16:41:01.808Z pid=597 tid=owznmnngh class=MessageBroadcastWorker jid=11d9da030dd20e89cd6c774e elapsed=0.075 INFO: fail
2020-03-22T16:41:01.808Z pid=597 tid=owznmnngh WARN: {"context":"Job raised exception","job":{"retry":true,"queue":"default","class":"MessageBroadcastWorker","args":["#<Message:0x00007f9f94227d48>"],"jid":"11d9da030dd20e89cd6c774e","created_at":1584844758.799895,"enqueued_at":1584895261.7334359,"error_message":"undefined method `body' for \"#<Message:0x00007f9f94227d48>\":String","error_class":"ActionView::Template::Error","failed_at":1584844758.877783,"retry_count":11,"retried_at":1584877194.326414},"jobstr":"{\"retry\":true,\"queue\":\"default\",\"class\":\"MessageBroadcastWorker\",\"args\":[\"#<Message:0x00007f9f94227d48>\"],\"jid\":\"11d9da030dd20e89cd6c774e\",\"created_at\":1584844758.799895,\"enqueued_at\":1584895261.7334359,\"error_message\":\"undefined method `body' for \\\"#<Message:0x00007f9f94227d48>\\\":String\",\"error_class\":\"ActionView::Template::Error\",\"failed_at\":1584844758.877783,\"retry_count\":11,\"retried_at\":1584877194.326414}"}
2020-03-22T16:41:01.808Z pid=597 tid=owznmnngh WARN: ActionView::Template::Error: undefined method `body' for "#<Message:0x00007f9f94227d48>":String
2020-03-22T16:41:01.808Z pid=597 tid=owznmnngh WARN: /Users/me/code/project/app/views/messages/_message.html.erb:3:in `block in _app_views_messages__message_html_erb__359591413316599227_70291875480180'

Я знаю, что такое неопределенная ошибка метода - это , но я не могу понять, почему я не могу позвонить body на message, когда передаю self фоновому рабочему в модели.

1 Ответ

1 голос
/ 23 марта 2020

Передайте id в Sidekiq вместо активного объекта записи.

MessageBroadcastWorker.perform_async id

https://github.com/mperham/sidekiq/wiki/Best-Practices#1 -make-your-job-параметры-small-and-simple

...