"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