我们升级到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)
归档时间: |
|
查看次数: |
1552 次 |
最近记录: |