我二楼已经叫你上传代码了,一定是漏了东西,关掉 CRSF 和 8 楼的操作都不是解决方法。
新手遇到这个问题最常见的原因:
<%= csrf_meta_tags %>
。// require rails-ujs
。楼主搜到一个“方案”不去了解原理就认为“解决了”,不是好的学习习惯。
引申阅读:
Ruby on Rails 安全指南 / 3 跨站请求伪造(CSRF) https://ruby-china.github.io/rails-guides/security.html#cross-site-request-forgery-csrf
你没有理解 heroku 的运作原理,heroku 应用运行在叫做 dynos 的容器里面,不同于一般的 Linux server,为了安全肯定做了一些限制。就算用 heroku run shell 成功安装了某个包,因为它是单独开启的容器,里面的修改也不能用于其它服务进程。
如果你需要修改 heroku 容器,需要了解它的 Builde pack 机制。
不过还有更好的选择,就是通过 docker 镜像部署。
把代码放到 github,一定是漏了东西。一楼的设置是关掉安全防护,不安全。
把查询对象存到外部再读回来?听起来很有问题,数据交互应该尽可能用简单的对象。
用着 dotenv
开发环境的 docker 只打包系统依赖,例如 libpg-dev,nodejs 这些,项目文件是通过 volumes mount 进去的。Rails 的 auto reload 和 webpacker 的 live reload 都能正常用。
我开发环境用 docker 的目的是为了让开发环境和生产环境等价。曾经试过开发环境用了新版本的 redis 和新命令,上线之后才发现不支持而崩溃。
我把大部分配置都放到了环境变量里,不过还有有一些行为是硬编码不可配置的,例如 rails db 下的命令,开发环境执行的同时会对 test db 也执行一遍,所以我做了折衷,Rails 默认行为不去改它,新增的配置遵循 12factor。只改配置,不区分 staging 和 production 环境。
Heroku 节省了一个运维团队啊,对小公司绝对是省钱,如果没有运维团队那其实是开发在付出时间成本。
单机部署风险太大,不同地方都见过单机部署服务器崩溃,然后备份没工作的事故了。
上面的意思是持久化服务不要放 k8s 里面,因为要做得对很难。
👏👏👏
不发帖都没留意呢。
docker compose 只适合用来搭开发环境,生产环境需要 k8s 之类的编排工具,然后对于需要持久化的服务要有特殊处理,最好用云服务。
用 docker compose。
cached 是主机到容器单向同步,会不会导致每次重启 node_modules 都要重装?而且据文档介绍同步有延迟。
volumn 慢用 http://docker-sync.io/ 解决。
解决了 volumn 慢的问题,开发环境我觉得没啥坑了。生产环境比较折腾,除非用 Heroku。
以前发过的一个技巧在这里汇总一下。
如果使用 docker,可以在 bash 配置里面加一个方法:
sandbox() {
docker run -it -v $(pwd):/app -w /app $1 bash
}
然后可以方便的打开不同版本的 ruby 沙箱环境:
$ sandbox ruby:2.3
临时测试版本差异的时候会用到。
装过 rvm 没清理干净,找找 .bashrc .bash_profile .profile 几个配置文件删掉 rvm 相关的内容。
贴日志
Linode 一直以来只做虚拟主机这层,VPC 都没有,运维全靠自己,已经不满足生产需求了。
DigitalOcean 的基础服务足够,配置比 AWS 简单(AWS 配置的门槛较高),可以作为业余和云服务入门。
不过业余项目我最推荐是 Heroku,运维领先业界 5 年,可以把心思都放在开发上。
生产项目就不提了,因为国内网络环境的问题选择不多。
bundle stdout: rbenv: /home/chuck/.rvm/bin/rvm: command not found
用的是 rbenv 还是 rvm?去掉不必要那个。
日志贴全,隐去敏感信息。
如果是手工发 ajax 请求,要自己处理浏览器返回的内容。所以还是:上代码。
日志显示没有 route 到 destroy action。
日志显示就是没找到路由,你以为的问题可能和实际问题不一样,把代码和意图贴上来。
这个问题我之前也没留意,搜了一下,以前有讨论帖
https://ruby-china.org/topics/15581
还有 StackOverflow 的回答
https://stackoverflow.com/questions/3430280/how-does-object-id-assignment-work https://stackoverflow.com/questions/2818602/in-ruby-why-does-inspect-print-out-some-kind-of-object-id-which-is-different/2818916#2818916
大概意思是 Ruby 计算不同的对象的 obejct_id 时候用了不同的规则,让一些不需要分配内存的值对象 id 和其它 obejct 不冲突,除了 true/false/nil 等固定值外,比较特殊的有 fixnum 和 obejct 的计算规则。
fixnum object_id = 值 * 2 + 1
object object_id = 指针地址 / 2
因为在某些计算机上,指针地址的末位都是 0,所以就把末位为 1 的空间除了几个固定值以外的空间都分配给 fixnum。(写到这里我觉得 object 的 object_id 不除以 2 也可以啊,也许是为了显得紧凑?期待其它人回答)
反过来说,一般对象的 object_id 乘以 2 就是指针地址:
> user.to_s
=> "#<User:0x00000008b8bca0>"
> user.object_id
=> 73162320
> (user.object_id * 2).to_s 16 # 16 进制显示
=> "8b8bca0"
> (user.object_id << 1).to_s 16 # 二进制里面,乘以 2 其实就是左移 1 位。
=> "8b8bca0"
> 0x00000008b8bca0.to_s 2 # 2 进制显示
=> "1000101110001011110010100000"
> user.object_id.to_s 2 # 二进制显示,比上面末尾少一个 0,
=> "100010111000101111001010000"
> (user.object_id << 1).to_s 2 # 二进制比较容易看出为什么末尾为 1 就能区分 fixnum 和 object。
=> "1000101110001011110010100000"
😂我看了这篇博客去官网仓库找,还以为就是 dep,原来还有别的吗?我已经凌乱了。
昨晚开始被 DDOS。