这一看大概是 Hash,里面有的值还是对象(非基本类型),要把它格式化为 json 是什么需求?
硬要做的话:
require 'json'
JSON.dump @env
例如 Github 和 Shopify?
看样子是 Sequel 捕获了 SQLite3 的异常,包裹在 Sequel::DatabaseError 里面再抛出,到用户代码这里能捕获的是 Sequel::DatabaseError。
这是特意把所有可选项列出来了,像 db 那里不需要一次学那么多 db。
所谓前后端分离就是 Rails 只写 API,前端放在另一项目,那么怎么搞都可以。如果想彻底一点,Rails 有个 API mode,不加载 view 和 session 相关的组件。
是的。
Rails 加上 Hotwire 就满足很多场景了。
dokcer swarm 有 rolling updates https://docs.docker.com/compose/compose-file/compose-file-v3/#update_config
配合 healthcheck 可以实现无中断更新 https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck
我现在用着 rails-ujs 带的 Rails.ajax 方法,看上去以后 rails-ujs 会被抛弃,到时就转 request.js。
简单方法是先用 form_with
生成一个常规 Rails form(带有 csrf token),然后页面内一段 js 提交:
<script>document.getElementById('form-id').submit()</script>
搜 js 提交可能会查到纯 ajax 然后碰到 csrf token 的问题。
自建建议用 jekyll,横行比较别家静态网站生成器,我也觉得 jekyll 维护最好,文档齐全。
马太效应,强者越强。有这个需求的一开始就会选最成熟的平台,缺少人扩展 Ruby 的这一领域。
link_to method: :post
依赖 Rails ujs,是只能在 Rails view 里面使用的辅助方法。邮件内容在邮件客户端打开,没有加载 rails ujs 的前端库,不能使用。
通常做法是在邮件里写一个对应 get 的页面地址,在这个地址内让用户手动或者用 js 自动提交 post 请求。
新的层在 app/ 下新增目录就行了,app/ 下的目录会加到 autoload 的路径里,lib/ 目录还需要配置。
The Rails Doctrine 是 Rails 哲学的总结
原版:https://rubyonrails.org/doctrine/
中文翻译:https://github.com/ruby-china/the-rails-doctrine
其中“多元化的设计模式”这一节说了 model 层为什么是这样的,简单来说就是:实用。
如果还是觉得“我就是需要 service 层啊,Rails 不提供就是不对”,那么可以试试我写的这个 gem https://github.com/chloerei/active_service ……
多谢推荐
静态博客用来锻炼设计能力是不错的。
现在内容少,还是人工的。
是 ActiveStorage,附件的地址为了美观用了定制 Controller。
可以参考 https://gorails.com/ ,有订阅教程,也有按课程收费。直播感觉效率低又不可扩展。
这是社区准则 https://geeknote.net/policy/posts/190
目前看来不打广告卖货就行。
如果是第一次独立开发一个网站的话,不错,要坚持。
提个设计的意见,导航条的返回上一步和菜单按钮不应该同时出现。
会做的,优先级已经排在前面了。
导出功能还没开发,在要做列表中。预计文章和图片可以导出,评论暂定没有。
我用 docker 的目的之一是统一开发机的开发环境,如果应用跑在宿主机就做不到统一了,例如有的是 Linux,有的是 Mac,那么安装 imagemagick 等系统依赖,编译 gem 包的时候可能有差异。
风险的话,自己的应用还好,别人的应用要提防应用里面有恶意代码(例如盗取 ssh key)。我发现 vscode 有个好的功能是每次打开新项目会提示是否信任当前目录,如果不信任就不会运行一些需要运行代码的插件。
我开发环境是不安装 gem 和 npm 包到镜像里,而是启动容器之后安装到跟主机目录同步的 /app 文件夹。
分了几个 stage,base 用来开发;ci 用来跑自动化测试;builder 用来打包静态文件;production 继承 base,只安装必要的 gem 包,直接拷贝 builder 打包好的静态文件,不安装 npm 包。还有优化空间,但不想写得太复杂。
### base stage ###
FROM ubuntu:20.04 AS base
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
curl \
git \
gnupg \
imagemagick \
libpq-dev \
nodejs \
postgresql-client \
ruby \
ruby-dev \
zlib1g-dev
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y --no-install-recommends yarn
RUN gem install bundler -v 2.2.0
WORKDIR /app
### CI stage ###
FROM base AS ci
COPY Gemfile Gemfile.lock /app/
RUN bundle install --deployment && \
rm vendor/bundle/ruby/2.7.0/cache/*
COPY package.json yarn.lock /app/
RUN yarn install && \
yarn cache clean
COPY . /app/
### Budiler stage ###
FROM ci AS builder
RUN RAILS_ENV=production SECRET_KEY_BASE=1 bin/rails assets:precompile
### production stage ###
FROM base AS production
COPY Gemfile Gemfile.lock /app/
RUN bundle install --deployment --without test development && \
rm vendor/bundle/ruby/2.7.0/cache/*
COPY . /app/
COPY --from=builder /app/public/packs /app/public/packs
ENV RAILS_ENV=production
docker-compose.yml
要指定 base stage。另外还用了 docker-sync 提高文件同步性能。
version: '3.4'
services:
web:
build:
context: .
target: base
command: bin/rails server -b 0.0.0.0
environment:
WEBPACKER_DEV_SERVER_HOST: webpacker
volumes:
- geeknote-sync:/app:nocopy
ports:
- 3000:3000
depends_on:
- postgres
- redis
webpacker:
build:
context: .
target: base
command: bin/webpack-dev-server
environment:
WEBPACKER_DEV_SERVER_HOST: webpacker
volumes:
- geeknote-sync:/app:nocopy
ports:
- 3035:3035
worker:
build:
context: .
target: base
command: bundle exec sidekiq
volumes:
- geeknote-sync:/app:nocopy
depends_on:
- postgres
- redis
postgres:
image: postgres:12
environment:
POSTGRES_PASSWORD: postgres
redis:
image: redis:5
volumes:
geeknote-sync:
external: true
开发的时候先打开一个 shell docker-compose run web bash
,第一次安装 gem 用 bundle install --path vendor/bundle
,之后就正常 bundle。
好,重现了,看来要加个状态判断,我记到 bug 列表。😂
有可能是我的锅,看起来像是 js event 重复绑定的现象,但是我这不能重现。如果重现的话回忆一下之前的操作。
会加,下周之内。
这个在计划列表中,已经不少人提了,我要加紧了。😅