Ошибка Ruby FrozenString в Sidekiq Worker

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я использую Ruby on Rails и пытаюсь использовать Sidekiq worker, но в какой-то момент я сталкиваюсь с проблемой, когда рабочий вызывает представление, представление вызывает беспокойство, а затем беспокойство не может обновить переменную в своей функции из-за ошибки FrozenString.

Например, вот как выглядит мой рабочий:

 class ReportGeneratorWorker
    include Sidekiq::Worker, ReportHelper
    sidekiq_options queue: Rails.env.to_sym
    
    def perform
        ac_base = ApplicationController.new
        body_html = ac_base.render_to_string template: "common/report_templates/generate_pdf.html.erb", layout: false
    end
end
  

Опять же, представление вставляет текст, который использует проблему, но проблема не позволяет ему обновляться. Смотрите ниже, например:

 [3] pry(#<#<Class:0x00007fec8ceea400>>)> html
=> "<ul>"
[4] pry(#<#<Class:0x00007fec8ceea400>>)> html.class.name                                          
=> "String"
[5] pry(#<#<Class:0x00007fec8ceea400>>)> html << "Hello"                                                                                                                 
FrozenError: can't modify frozen String
from (pry):5:in `replacement_text'
  

Есть идеи, почему это происходит? Если я снова определю переменную из консоли Pry, то она действительно работает:

 [1] pry(#<#<Class:0x0000557f07a25130>>)> html
=> "<ul>"
[2] pry(#<#<Class:0x0000557f07a25130>>)> html << "TEST"
FrozenError: can't modify frozen String
from (pry):2:in `replacement_text'
[3] pry(#<#<Class:0x0000557f07a25130>>)> html = "<ul>"
=> "<ul>"
[4] pry(#<#<Class:0x0000557f07a25130>>)> html << "TEST"
=> "<ul>TEST"
[5] pry(#<#<Class:0x0000557f07a25130>>)> 
  

Ответ №1:

Я смог решить эту проблему, заменив << на = .