"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
`fragment_for'
  actionpack (3.0.8) lib/action_view/helpers/cache_helper.rb:38:in
`cache'
  app/views/customers/index.html.erb:18:in
`_app_views_customers_index_html_erb__218860319__625647498_0'
  ...

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)
        else
          # VIEW TODO: Make #capture usable outside of ERB
          # This dance is needed because Builder can't use capture
          pos = output_buffer.length
          yield
          fragment = output_buffer.slice!(pos..-1) #
PROBLEM
          controller.write_fragment(name, fragment, options)
        end
      end

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"

Thanks,

Prem

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
xx.underscore
xx.titlecase
xx.pluralize

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,

Prem