"Cannot modify SafeBuffer in place" thrown by CacheHelper

After upgrading from 3.0.7 to 3.0.8, I get the following error:

  activesupport (3.0.8) lib/active_support/core_ext/string/
output_safety.rb:114:in `slice!'
  actionpack (3.0.8) lib/action_view/helpers/cache_helper.rb:56:in
  actionpack (3.0.8) lib/action_view/helpers/cache_helper.rb:38:in

As far as I can tell, the method `fragment_for` in `CacheHelper` is
calling `slice!` on a `SafeBuffer` object.

      def fragment_for(name = {}, options = nil, &block) #:nodoc:
        if controller.fragment_exist?(name, options)
          controller.read_fragment(name, options)
          # VIEW TODO: Make #capture usable outside of ERB
          # This dance is needed because Builder can't use capture
          pos = output_buffer.length
          fragment = output_buffer.slice!(pos..-1) #
          controller.write_fragment(name, fragment, options)

However, `slice!` is also one of the unsafe methods defined in
`ActiveSupport::SafeBuffer`. Therefore an exception is thrown.

Best regards,
Christoph Schiessl

you can fix this using output_buffer = output_buffer.slice(pos…-1) instead of using slice!

This has been resolved in the `3-0-stable` branch. I'd suggest you to downgrade your application and wait for release, or point your Gemfile to 3-0-stable.

    gem 'rails', :git => "git://github.com/rails/rails.git", :branch => "3-0-stable"



This should also be fixed in the next release of Rails 3.0.x

This problem seems to be more widespread:
xx = "safe string".html_safe

Each inflection throws the same exception. Inflections should be safe
operations...shouldn't they?

(although xx.(upcase|downcase|dasherize) are fine)

I haven't verified it yet, but it doesn't really look like in-place methods. Do you mind open up a ticket in Github?

Thank you,