Я обновляю приложение с Rails 2 до Rails 3. Судя по всему, вызов render()
теперь возвращает ActionView::OutputBuffer
, а не String
.Мне нужно передать результаты render()
в URI.escape()
, и это не сработало за исключением ...
Вот мое краткое тестирование в консоли
ob = ActionView::OutputBuffer.new("test test")
URI.escape(ob)
`NoMethodError: undefined method 'each_byte' for nil:NilClass`.
from /opt/ruby19/lib/ruby/1.9.1/uri/common.rb:307:in `block in escape'
from ..../ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/core_ext/string/output_safety.rb:160:in `gsub'
from ..../ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/core_ext/string/output_safety.rb:160:in `gsub'
from /opt/ruby19/lib/ruby/1.9.1/uri/common.rb:304:in `escape'
from /opt/ruby19/lib/ruby/1.9.1/uri/common.rb:623:in `escape'
Более того, вызов to_sв OutputBuffer возвращает тот же класс OutputBuffer, поэтому я даже не могу преобразовать этот буфер в честную строку?
ob.to_s.class
ActionView::OutputBuffer
Конечно, вызов URI.escape ("test test") возвращает "test% 20test", как и ожидалось,так что это не проблема URI.
Среда:
- ruby 1.9.3p125 (2012-02-16, редакция 34643) [i686-linux]
- Rails 3.2.1
Мой вопрос: Почему это происходит и как я могу обойти эту проблему?
Обновление: Видимо,использование '' + ob
в качестве формы ob.to_s
преобразует OutputBuffer в String, что эффективно решает проблему ... Но мой вопрос ', почему это происходит ' все еще остается, например, если это ошибка, следуетЯ сообщаю об этом, или я делаю что-то не так?