• 郵箱激活功能 at August 27, 2021

    简单方法是先用 form_with 生成一个常规 Rails form(带有 csrf token),然后页面内一段 js 提交:

    <script>document.getElementById('form-id').submit()</script>
    

    搜 js 提交可能会查到纯 ajax 然后碰到 csrf token 的问题。

  • 自建建议用 jekyll,横行比较别家静态网站生成器,我也觉得 jekyll 维护最好,文档齐全。

  • 马太效应,强者越强。有这个需求的一开始就会选最成熟的平台,缺少人扩展 Ruby 的这一领域。

  • 郵箱激活功能 at August 25, 2021

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

  • null at August 07, 2021

    多谢推荐 😃

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

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

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

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

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

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

  • 建立 hello reader 网站 at August 02, 2021

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

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

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

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

  • 我用 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 的定位,写文章的话并不需要太多复杂的格式。

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