2019年有几个项目,用的是rails4, ruby 2.5, ruby 2.6 。现在统一给他们做个升级。
1. 找个最新的docker 环境, ruby 3.3.10
2. 删掉原来的Gemfile中的gem 版本号。 也可以删掉Gemfile.lock
3. gem redis 与 redis-rails是冲突的,删掉 redis-rails
4. application.yml中,不要使用 << default 这样的用法了。psych最新版本不支持了。https://stackoverflow.com/a/78987406/445908
config/database.yml , application.yml , log4r.yml 都检查下。
5. 创建 app/assets/config/manifest.js, 内容为:
//= link_tree ../images //= link_directory ../javascripts .js //= link_directory ../javascripts .coffee //= link_directory ../stylesheets .css //= link_directory ../stylesheets .scss
6. config/application.rb ,删掉:
config.active_record.raise_in_transactional_callbacks = true
7. 修改 config/routes.rb 路由,不要在路由中使用 : 或者 => 这样的语法,例如
### 修改的内容:
1. 1.
挂载Ckeditor引擎 :
- 旧语法: mount Ckeditor::Engine => '/ckeditor'
- 新语法: mount Ckeditor::Engine, at: '/ckeditor'
2. 2.
POST路由定义 :
- 旧语法: post "/send_manager_sms_token" => 'api#send_manager_sms_token'
- 新语法: post "/send_manager_sms_token", to: 'api#send_manager_sms_token'
3. 3.
GET路由定义 :
- 旧语法: get '/signout' => 'sessions#destroy', :as => :signout
- 新语法: get '/signout', to: 'sessions#destroy', as: :signout
4. 4.
其他GET路由定义 :
- 旧语法:
```
get "/help_center/:type/articles/:id"
=> 'private/help_articles#show'
get "/help_center/:type/article_list/
:id" => 'private/
help_articles#article_list'
get "/documents/:type/:id" => 'private/
copywritings#show'
```
- 新语法:
```
get "/help_center/:type/articles/:id",
to: 'private/help_articles#show'
get "/help_center/:type/article_list/
:id", to: 'private/
help_articles#article_list'
get "/documents/:type/:id", to:
'private/copywritings#show
```
具体见帮助吧。我是用ai直接修改的。
8. 遇到了一个500 错误,server error, 但是没有任何信息。 rails c 正常。log 也没有新文件,总之就是看不到问题。
解决办法:RAILS_ENV=production bundle exec rake assets:precompile
进入到生产模式看看。 ( 也可以参考:https://stackoverflow.com/ questions/8772425/500-internal-server-error-for-rails-app-with-no-errors-recorded-in-any-log-file )
9. before_filter => before_action
10. 设置 config/storage.yml
local:
service: Disk
root: <%= Rails.root.join("storage") %>
11. bin/rails credentials:edit 重新生成 credentials.yml
12. 先把 RAILS_ENV=production bundle exec rake assets:precompile 的问题都搞定。例如:
application.coffee 中,一定是包含了.coffee文件的, .js 文件,会报错。
去掉 gem uglifier, 以及 config/environtments/production.rb 中的 uglifier 相关内容,替换为:
# 在Gemfile中添加
gem 'terser'
# 在production.rb中配置
config.assets.js_compressor = :terser
13. 如果仍然遇到500问题,没有任何报警日志,那么就一点一点的分析。例如,去掉 view, 去掉action的逻辑,render text .. 看看怎么样。
_theme.scss.erb
14. 下面也是500问题。 原因应该是rails8 的参数安全机制。
<%= link_to lang[:name], params.merge(lang: lang[:code]) %>
需要修改为:
<%= link_to lang[:name], { controller: 'private/members', action: params[:action], lang: lang[:code]} %>
发现了,我所有的页面,view的错误,都不会显示stack trace ,
其他人也有这样的问题:
1. https://www.ruby-forum.com/t/problem-setting-log-level/223135 它说是rails路径有空格引起的。可是我的没有啊。