从Rails 4降级到Rails 3之后的错误,如"NoMethodError:未定义的方法`扫描'## Hash ..."

Hen*_*k N 8 ruby-on-rails

我们升级到Rails 4,遇到了一些重大问题并再次降级(恢复升级提交).

然后我们得到了错误

NoMethodError (undefined method `sweep' for #<Hash:0x007f01ab44a940>):
Run Code Online (Sandbox Code Playgroud)

看似因为Rails 4以一种Rails 3无法读取的方式在会话中存储闪存.

解决这个问题的好方法是什么?

Hen*_*k N 10

我们最终通过修补Rails本身来解决这个错误并删除borked flash.这意味着它可以非常透明地自我修复.

我们还确保只在Rails 3上应用此补丁,因此当我们再次尝试升级到Rails 4时它不会引起问题.

我们坚持这样config/initializers/rails4_to_rails3_downgradability.rb:

if Rails::VERSION::MAJOR == 3

  module ActionDispatch
    class Flash
      def call(env)
        if (session = env['rack.session']) && (flash = session['flash'])

          # Beginning of change!

          if flash.respond_to?(:sweep)
            flash.sweep
          else
            session.delete("flash")
          end

          # End of change!

        end

        @app.call(env)
      ensure
        session    = env['rack.session'] || {}
        flash_hash = env[KEY]

        if flash_hash
          if !flash_hash.empty? || session.key?('flash')
            session["flash"] = flash_hash
            new_hash = flash_hash.dup
          else
            new_hash = flash_hash
          end

          env[KEY] = new_hash
        end

        if session.key?('flash') && session['flash'].empty?
          session.delete('flash')
        end
      end
    end
  end

end
Run Code Online (Sandbox Code Playgroud)


Swa*_*oop 5

面对同样的问题,通过告诉用户清除cookie来解决.可能不是每个人的解决方案,只是指出它是一个选项.