Rails - "не могу преобразовать символ в строку" только на производстве - PullRequest
4 голосов
/ 09 февраля 2011

У меня есть частичное представление, которое отображает специфические для модели флеш-сообщения. Частичное выглядит как:

приложение / просмотров / MyModel / _flashpartial.erb

<% flash.each do |key, value| %>
  <% if model_key = myModelFlash(key) then %>
    <%= content_tag(:div, value, :class => "flash #{model_key}") %>
  <% end %>
<% end %>

Метод myModelFlash просто берет ключ и проверяет определенный префикс, используя простое регулярное выражение. Находится в

Приложение / хелперы / mymodelhelper.rb

module MyModelHelper
  def myModelFlash( key )
    m = /^_mymodel_(.*)/.match(key)
    m[1] unless m.nil?
  end
end

Это прекрасно работает в моей среде разработки и тестирования. Как только он попадает на Heroku, я получаю сообщение об ошибке (ActionView :: Template :: Error) «не может преобразовать символ в строку», указывающее на вызов match.

Если я удаляю вызов myModelFlash из представления и просто отображаю ключ и значение, это прекрасно работает с точки зрения отсутствия ошибок, поэтому по крайней мере ключ и значение попадают в частичное представление просто хорошо. По какой-то причине вспомогательный метод считает, что передаваемый в него ключ является символом, а не строкой.

Есть идеи относительно того, почему это может происходить?

1 Ответ

3 голосов
/ 09 февраля 2011

Я предлагаю вам просто использовать key.to_s в качестве быстрого обходного пути.

Причина вашей проблемы может заключаться в том, что некоторые версии некоторых компонентов отличаются между вашим тестовым сервером и рабочим сервером.Если ваши тесты пройдены, и ваша производственная среда дает сбой, это очень плохая ситуация.

Вам следует сравнить версии ruby ​​и все используемые вами гемы.Если вы используете 'bundler', то 'bundle list' дает хорошую сводку.

Если вы обнаружите, что все версии одинаковы ... Что ж, мы будем искать другую причину.

Обновление

Похоже, что проблема вызвана не различиями версий, а непредвиденными данными во флэш-памяти, которые, очевидно, в производственной среде могут отличаться от тестовых.

Я предлагаю вам немного изменить метод myModelFlash.

def myModelFlash( key )
  if m = /^_mymodel_(.*)/.match(key.to_s)
    return m[1]
  end
end

Флэш-память может содержать разные ключи, некоторые из них могут быть символами или вообще чем-то, поэтому вы должны быть готовы справиться со всемииз них.

Преобразование параметра key в .to_s должно быть безопасным выбором, но если вы уверены, что всегда устанавливаете клавиши флэш-памяти (я имею в виду клавиши, связанные с этой проблемой "_mymodel")в качестве строк вы можете изменить первую строку этого метода:

def myModelFlash( key )
  if key.is_a?(String) && m = /^_mymodel_(.*)/.match(key.to_s)
    return m[1]
  end
end

И в своем тесте добавьте несколько других ключей к вашей флэш-памяти, а затем проверьте, как действие обрабатывает их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...