将近一天的折腾,把rails4升级到了rails5,部署到了服务器
Rails4 -> Rails5
- 修改Gemfile
gem 'rails', '4.2.6' -> gem 'rails', '~> 5.0.0'
然后bundle,报错是肯定的了。。。
把自己的Gem给注释了然后在bundle,是可以了。
然后取消注释,在bundle。有些gem不兼容。可以先去除。
bundle成功之后
rails s会发现
lib/active_support/dependencies.rb:293:in `require': cannot load such file -- rack/showexceptions (LoadError)
这个是由于sinatra的版本引起的,去使用最新的sinatra
#Gemfile
gem 'sinatra', '.0.0.beta2', require: false
然后重启就可以了。
重启会发现样式文件不对,是因为rails5有一个总的文件管理,在app/assets/config/manifest.js.不过内容不需要写。
然后部署的时候出现了
ArgumentError: Before process_action callback :verify_authenticity_token has not been defined
找了很久,在
skip_before_action :verify_authenticity_token, only: [:create]
修改
skip_before_action :verify_authenticity_token, only: [:create], raise: false
这样就可以了。
后期发现,manifest.js不加入相关内容会报错,然后加上去。
再次部署, 会出现
NoMethodError: undefined method `split' for nil:NilClass
google了很久,都是gem引起的。然后查找manifest的文档Rails 5: The Sprockets 4 Manifest.
可以发现,是版本的原因。不知道为啥不行,就先使用4.0以下的sprockets版本。
另外在正式环境上,可以发现controller中使用的lib下的类,报错找不到(开发环境不会出现这个问题)。
那是因为在生产环境上,是禁止使用了autoloading。参考
原文