• 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 ……

  • null at 2021年08月07日

    多谢推荐 😃

    静态博客用来锻炼设计能力是不错的。

  • 现在内容少,还是人工的。

  • 是 ActiveStorage,附件的地址为了美观用了定制 Controller。

  • 可以参考 https://gorails.com/ ,有订阅教程,也有按课程收费。直播感觉效率低又不可扩展。

  • 这是社区准则 https://geeknote.net/policy/posts/190

    目前看来不打广告卖货就行。

  • 建立 hello reader 网站 at 2021年08月02日

    如果是第一次独立开发一个网站的话,不错,要坚持。

    提个设计的意见,导航条的返回上一步和菜单按钮不应该同时出现。

  • 会做的,优先级已经排在前面了。

  • 导出功能还没开发,在要做列表中。预计文章和图片可以导出,评论暂定没有。

  • 我用 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 重复绑定的现象,但是我这不能重现。如果重现的话回忆一下之前的操作。

  • 会加,下周之内。

  • 这个在计划列表中,已经不少人提了,我要加紧了。😅

  • 我不是很喜欢第三方登录:

    1. 第三方不一定提供 Email 等联系信息,联系客服的时候要确认身份比较麻烦。
    2. 可能会忘记自己通过什么方式登录。
    3. 用密码管理器自动生成强密码已经足够安全和方便。
    4. 可能会遇到网络问题(用户到第三方,服务器到第三方)。

    如果很多人需要才会考虑。

  • 重置密码功能做好了 https://geeknote.net/user/password/new 😅

  • 先说为什么用 Markdown 而且没有实时预览。我觉得标记语言和所见即所得编辑器的区别是是否看得到源码,有的所见即所得编辑器添加了 markdown 快捷输入,其实应该归类于所见即所得。

    而所见即所得的问题也来自于看到的不是源码,没办法一眼看到自己的排版是否正确,举个例子:

    这个标题样式看不出有没有问题

    但如果是标记语言就能看出来了

    要不想每个元素选中查看是否格式正确,可以给一些元素添加额外的装饰。但搞太多装饰,又不如直接编辑源码一目了然,源码能提供一种无歧义的安全感。

    不过我不否认可视化编辑器的上限更高,例如添加各种高级格式的块,但是太花时间。而开源的可视化编辑器多少有点问题,例如处理 list 的时候,怎么结束列表换到段落,或者回车跟删除键的操作是否相互抵消的(试了下 slate 就有这个问题)。这些问题虽小,但是用的时候如果碰到不合预期的地方就会很别扭。

    我在项目之初定制了一个可视化编辑器(未完成) https://chloerei.com/rich-text-editor/ ,花了很多时间处理细节问题。我感觉已经完成了 70% 的目标,但是剩下 30% 可能要花两三倍时间处理,这样网站可能就卡在编辑器永远完不成了。其实我并不需要 GeekNote 的编辑器功能非常丰富,而是要清静,让人专注于内容。然后我又换到 Markdown 试了一下,只花了两三天就达到可用的状态了,于是我就换了。

    总结一下,就是有限时间内可视化编辑器做不到我满意的程度,而 Markdown 编辑器可以。


    不想用代码编辑器的原因一个是代码编辑器功能太多导致分心;另一个是附件管理太麻烦,每次插入图片都要打断思维。

  • 重置密码还没开发,用注册邮箱发邮件到 [email protected] 我给手动重置吧,之后再改密码。

  • 是有点碍眼,我稍后调整看看。

  • 测了一下国内访问正常,现在能访问吗?

  • 点右上角图标打开设置菜单里。

  • 好的,样式会再调整。

    所见即所得编辑器花了很多时间,但是发现越接近完成就越多小问题要处理,以至于网站本身没时间开发。后来做了个调查发现想用 Markdown 的人更多 https://twitter.com/chloerei/status/1368518434384797696 ,就转 Markdown 了。Markdown 也更符合 Geek 的定位,写文章的话并不需要太多复杂的格式。

  • 感谢~。可以搬运一篇旧文章体验一下功能,而且网站也需要一些种子内容😏。

  • 运营方向专注技术领域,设计上有不同的喜好。

  • 错误栈的作用就是让人查问题出处的,贴错误信息要贴全。

  • 看饿了。

  • 第一届“要空格”vs“不要空格”辩论大会开始 💁‍♂️

  • 先客观的做调研,看这东西能不能用。然后给老板报告,分析利害,有没有局限,有没有成功案例,花费的成本。最后让老板决定,因为公司终究是老板的(而你可以换公司……)。