<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>wdrsam (柱子上的新手)</title>
    <link>https://ruby-china.org/wdrsam</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>bundle install 时无法装 grpc 网上能找着的姿势都试了一圈还是不行</title>
      <description>&lt;p&gt;网上能找着的解决办法都尝试了一圈还是不行，Mac m1 的系统。&lt;/p&gt;

&lt;p&gt;最后的提示是&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;An error occurred &lt;span class="k"&gt;while &lt;/span&gt;installing snappy &lt;span class="o"&gt;(&lt;/span&gt;0.3.0&lt;span class="o"&gt;)&lt;/span&gt;, and Bundler cannot &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最开始卡住出错的提示是&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Installing grpc 1.50.0 with native extensions
    Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>wdrsam</author>
      <pubDate>Wed, 09 Nov 2022 17:30:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/42729</link>
      <guid>https://ruby-china.org/topics/42729</guid>
    </item>
    <item>
      <title>有没有试过，Rails 程序在最小多少内存里的机器里可以跑？</title>
      <description>&lt;p&gt;我试过 1G 的机器，docker 打包反正是不用想，完全用不起来。各位有没有试过最小内存的机器里跑 Rails 是什么体验？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Sat, 17 Sep 2022 10:14:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/42660</link>
      <guid>https://ruby-china.org/topics/42660</guid>
    </item>
    <item>
      <title>turbo_stream 如何实现以前 ujs 的效果？</title>
      <description>&lt;p&gt;例如一个请求过来，turbo_stream 来 render 了，就是执行了 turbo_stream 里的内容。现在想执行一段 js，比如过 3 秒关闭一个 div。在这个 turbo_stream 的思路下应该怎么实现这个效果呢？挺困惑的，是不是这种场景不该去使用 turbo_stream？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Mon, 05 Sep 2022 14:30:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/42632</link>
      <guid>https://ruby-china.org/topics/42632</guid>
    </item>
    <item>
      <title>Rails 7 中 turbo_stream 的问题</title>
      <description>&lt;p&gt;在用 Devise 时，退出的路由是 Delete，于是用 turbo-method 指定了 Delete 的请求方式。但请求 format 也变为了 Delete。在请求了 Devise 的退出登录的路由后&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Started DELETE &lt;span class="s2"&gt;"/users/sign_out"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; ::1 at 2022-08-06 22:45:15 +0800
Processing by Users::SessionsController#destroy as TURBO_STREAM
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.5ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; ORDER BY &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; ASC LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
Redirected to http://localhost:3000/
Completed 302 Found &lt;span class="k"&gt;in &lt;/span&gt;7ms &lt;span class="o"&gt;(&lt;/span&gt;ActiveRecord: 0.5ms | Allocations: 2075&lt;span class="o"&gt;)&lt;/span&gt;


Started DELETE &lt;span class="s2"&gt;"/"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; ::1 at 2022-08-06 22:45:15 +0800

ActionController::RoutingError &lt;span class="o"&gt;(&lt;/span&gt;No route matches &lt;span class="o"&gt;[&lt;/span&gt;DELETE] &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，得到了 302 的 status 后，它去请求了我指定的退出登录的 path，也就是根目录，但它同样带着 Delete 方式去请求。&lt;/p&gt;

&lt;p&gt;仅仅是退出登录，我应该不需要写一个 turbo_frame 把 header 那块替换掉吧？而且不知道为何它还要去用 Delete 方式请求一次"/"&lt;/p&gt;

&lt;p&gt;我唯一正确的处理方式就是：将 header 那块内容包在 turbo_frame 里。然后退出登录后，将显示"Sign in" 和 "Sign out"显示，并替换原本显示用户名的元素。&lt;/p&gt;

&lt;p&gt;是这样吗？感觉新的这个 turbo 和传统的思路不太一样。&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Sat, 06 Aug 2022 22:51:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/42577</link>
      <guid>https://ruby-china.org/topics/42577</guid>
    </item>
    <item>
      <title>Rails 7 esbuild 无法在 application 里 import controller 文件夹</title>
      <description>&lt;p&gt;新起了一个项目，对照着改了一遍，相关的包括 package.json 全都一样。不知道哪里不对，每次 build js 的时候就会说 application 中引入 controllers 不对。但奇怪的是，我单独去引用 controllers 文件夹里面的 index 和 application 这两个 JS 文件，却没有任何问题。&lt;/p&gt;

&lt;p&gt;我在引入了 bootstrap，试了下样式的可以用没有任何问题的，因为其实 build 出来本来也不会有什么问题。&lt;/p&gt;

&lt;p&gt;但我就是不知道，到底为什么它会说 application 中引入 controllers 那里有问题，几乎是照着文档弄的。&lt;/p&gt;

&lt;p&gt;麻烦各位看看能不能发现可能哪里有问题呢？不知道如何排查了。相关文件，都放下面了。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;17:46:36 js.1   | 1 error
17:46:36 js.1   | &lt;span class="o"&gt;[&lt;/span&gt;watch] build finished
17:46:49 js.1   | &lt;span class="o"&gt;[&lt;/span&gt;watch] build started &lt;span class="o"&gt;(&lt;/span&gt;change: &lt;span class="s2"&gt;"app/javascript/controllers"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
17:46:49 js.1   | ✘ &lt;span class="o"&gt;[&lt;/span&gt;ERROR] Could not resolve &lt;span class="s2"&gt;"./controllers"&lt;/span&gt;
17:46:49 js.1   |
17:46:49 js.1   |     app/javascript/application.js:3:7:
17:46:49 js.1   |       3 │ import &lt;span class="s2"&gt;"./controllers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;package.json&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"app"&lt;/span&gt;,
  &lt;span class="s2"&gt;"private"&lt;/span&gt;: &lt;span class="s2"&gt;"true"&lt;/span&gt;,
  &lt;span class="s2"&gt;"dependencies"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"@hotwired/stimulus"&lt;/span&gt;: &lt;span class="s2"&gt;"^3.1.0"&lt;/span&gt;,
    &lt;span class="s2"&gt;"@hotwired/turbo-rails"&lt;/span&gt;: &lt;span class="s2"&gt;"^7.1.3"&lt;/span&gt;,
    &lt;span class="s2"&gt;"@popperjs/core"&lt;/span&gt;: &lt;span class="s2"&gt;"^2.11.5"&lt;/span&gt;,
    &lt;span class="s2"&gt;"bootstrap"&lt;/span&gt;: &lt;span class="s2"&gt;"^5.1.3"&lt;/span&gt;,
    &lt;span class="s2"&gt;"bootstrap-icons"&lt;/span&gt;: &lt;span class="s2"&gt;"^1.8.3"&lt;/span&gt;,
    &lt;span class="s2"&gt;"esbuild"&lt;/span&gt;: &lt;span class="s2"&gt;"^0.14.51"&lt;/span&gt;,
    &lt;span class="s2"&gt;"sass"&lt;/span&gt;: &lt;span class="s2"&gt;"^1.52.1"&lt;/span&gt;,
    &lt;span class="s2"&gt;"sortable"&lt;/span&gt;: &lt;span class="s2"&gt;"^2.0.0"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"scripts"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"build:css"&lt;/span&gt;: &lt;span class="s2"&gt;"sass app/assets/stylesheets/application.scss app/assets/builds/application.css --no-source-map --load-path=node_modules"&lt;/span&gt;,
    &lt;span class="s2"&gt;"build"&lt;/span&gt;: &lt;span class="s2"&gt;"esbuild app/javascript/application.js --bundle --outdir=app/assets/builds"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Procfile.dev&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;web: bin/rails server &lt;span class="nt"&gt;-p&lt;/span&gt; 3000
css: yarn build:css &lt;span class="nt"&gt;--watch&lt;/span&gt;
js: yarn build &lt;span class="nt"&gt;--watch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;app/javascripts/application.js&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Entry point &lt;span class="k"&gt;for &lt;/span&gt;the build script &lt;span class="k"&gt;in &lt;/span&gt;your package.json
import &lt;span class="s2"&gt;"@hotwired/turbo-rails"&lt;/span&gt;
import &lt;span class="s2"&gt;"./controllers"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 controllers 文件夹里仅有 1 个默认的 application.js 和一个我自己加的 js 文件
app/javascripts/controllers/index_controller.js&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import &lt;span class="o"&gt;{&lt;/span&gt; Controller &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"@hotwired/stimulus"&lt;/span&gt;

// Connects to data-controller&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"hello"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;default class extends Controller &lt;span class="o"&gt;{&lt;/span&gt;
  connect&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

  greet&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    console.log&lt;span class="o"&gt;(&lt;/span&gt;123&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;app/javascript/controllers/application.js&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import &lt;span class="o"&gt;{&lt;/span&gt; Application &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"@hotwired/stimulus"&lt;/span&gt;

const application &lt;span class="o"&gt;=&lt;/span&gt; Application.start&lt;span class="o"&gt;()&lt;/span&gt;

// Configure Stimulus development experience
application.debug &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false
&lt;/span&gt;window.Stimulus   &lt;span class="o"&gt;=&lt;/span&gt; application

&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; application &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;manifest.js&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//&lt;span class="o"&gt;=&lt;/span&gt; link_tree ../builds

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>wdrsam</author>
      <pubDate>Mon, 01 Aug 2022 18:07:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/42568</link>
      <guid>https://ruby-china.org/topics/42568</guid>
    </item>
    <item>
      <title>在 Docker 环境里，大家密码都是如何管理的呢？</title>
      <description>&lt;p&gt;例如我自己这试着搭的一个 Docker，就把密码直接丢在 docker-compose 里。像 production 环境用 docker，大家是怎么管理密码的呢？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Tue, 07 Jun 2022 11:57:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/42437</link>
      <guid>https://ruby-china.org/topics/42437</guid>
    </item>
    <item>
      <title>有段时间没写 Rails，看着 7 出了，自己试了试，引入 Font-awesome 遇到点问题。</title>
      <description>&lt;p&gt;有段时间没写 Rails，看着 7 都出了，自己试了试，遇到点问题。&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;private"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dependencies"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@fortawesome/fontawesome-free"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^6.1.1"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@hotwired/stimulus"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^3.0.1"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@hotwired/turbo-rails"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^7.1.3"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@popperjs/core"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^2.11.5"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bootstrap"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^5.1.3"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bootstrap-icons"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^1.8.3"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;esbuild"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^0.14.42"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sass"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^1.52.1"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sortable"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^2.0.0"&lt;/span&gt;
  &lt;span class="pi"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scripts"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;build:css"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sass&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;app/assets/stylesheets/application.scss&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;app/assets/builds/application.css&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--no-source-map&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--load-path=node_modules"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;build"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;esbuild&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;app/javascript/application.js&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--bundle&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--outdir=app/assets/builds"&lt;/span&gt;
  &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;application.scss 里
&lt;a href="/import" class="user-mention" title="@import"&gt;&lt;i&gt;@&lt;/i&gt;import&lt;/a&gt; '&lt;a href="/fortawesome" class="user-mention" title="@fortawesome"&gt;&lt;i&gt;@&lt;/i&gt;fortawesome&lt;/a&gt;/fontawesome-free/css/all';&lt;/p&gt;

&lt;p&gt;在 builds 里也确确实实看到样式被编译进去，但 Web 上并不生效。用 CDN 的话就没问题。应该是我字体没引入的原因吧？应该把字体引入进去呢？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Tue, 31 May 2022 11:46:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/42427</link>
      <guid>https://ruby-china.org/topics/42427</guid>
    </item>
    <item>
      <title>Docker 项目中，yarn add 或 Gemfile 里添加新插件时的最佳实践应该是如何的？</title>
      <description>&lt;p&gt;我不确定各位在使用 docker 时候的最佳实践是怎么样的。这样 build 后没有问题，但每次我 yarn add 插件进去，我比如在我的 entrypoint 里启动 server 之前必须 yarn install 一下，或者重新 build。
总觉得这里方式不太对，请问下各位是如何处理的？同理，包括 Gemfile 中新加 gem 进去，都必须重新 build？&lt;/p&gt;

&lt;p&gt;感觉本地开发挺浪费时间的。不然就是本地开发时在 entrypoint 里加启动 server 之前主动 yarn install 以及 bundle 一下，等做完要发布，把这两行删掉，丢上去重新 build。&lt;/p&gt;

&lt;p&gt;Dockerfile&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;FROM ruby:2.6.3-alpine&lt;/span&gt;

&lt;span class="s"&gt;ENV BUNDLER_VERSION=2.2.6&lt;/span&gt;

&lt;span class="s"&gt;RUN apk add --update --no-cache \&lt;/span&gt;
      &lt;span class="s"&gt;binutils-gold \&lt;/span&gt;
      &lt;span class="s"&gt;build-base \&lt;/span&gt;
      &lt;span class="s"&gt;curl \&lt;/span&gt;
      &lt;span class="s"&gt;file \&lt;/span&gt;
      &lt;span class="s"&gt;g++ \&lt;/span&gt;
      &lt;span class="s"&gt;gcc \&lt;/span&gt;
      &lt;span class="s"&gt;git \&lt;/span&gt;
      &lt;span class="s"&gt;less \&lt;/span&gt;
      &lt;span class="s"&gt;libstdc++ \&lt;/span&gt;
      &lt;span class="s"&gt;libffi-dev \&lt;/span&gt;
      &lt;span class="s"&gt;libc-dev \&lt;/span&gt;
      &lt;span class="s"&gt;linux-headers \&lt;/span&gt;
      &lt;span class="s"&gt;libxml2-dev \&lt;/span&gt;
      &lt;span class="s"&gt;libxslt-dev \&lt;/span&gt;
      &lt;span class="s"&gt;libgcrypt-dev \&lt;/span&gt;
      &lt;span class="s"&gt;make \&lt;/span&gt;
      &lt;span class="s"&gt;netcat-openbsd \&lt;/span&gt;
      &lt;span class="s"&gt;nodejs \&lt;/span&gt;
      &lt;span class="s"&gt;openssl \&lt;/span&gt;
      &lt;span class="s"&gt;pkgconfig \&lt;/span&gt;
      &lt;span class="s"&gt;postgresql-dev \&lt;/span&gt;
      &lt;span class="s"&gt;python \&lt;/span&gt;
      &lt;span class="s"&gt;tzdata \&lt;/span&gt;
      &lt;span class="s"&gt;yarn&lt;/span&gt;

&lt;span class="s"&gt;RUN gem install bundler -v 2.2.6&lt;/span&gt;
&lt;span class="s"&gt;WORKDIR /app&lt;/span&gt;
&lt;span class="s"&gt;COPY Gemfile Gemfile.lock ./&lt;/span&gt;
&lt;span class="s"&gt;RUN bundle config build.nokogiri --use-system-libraries&lt;/span&gt;
&lt;span class="s"&gt;RUN bundle check || bundle install&lt;/span&gt;
&lt;span class="s"&gt;COPY package.json yarn.lock ./&lt;/span&gt;
&lt;span class="s"&gt;RUN yarn install --check-files&lt;/span&gt;
&lt;span class="s"&gt;COPY . ./&lt;/span&gt;
&lt;span class="s"&gt;ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>wdrsam</author>
      <pubDate>Fri, 23 Jul 2021 17:52:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/41497</link>
      <guid>https://ruby-china.org/topics/41497</guid>
    </item>
    <item>
      <title>如何 sidekiq -r 引用的文件中 require active support 模块</title>
      <description>&lt;p&gt;用 sidekiq -r 单独引用我的 A worker 文件，A worker 中引用了一个 demo.rb，在 demo.rb 中想使用 active support 的一些方法。但只要用 sidekiq -r 引用文件，就会说&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="nb"&gt;load&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;active_support&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该怎么能在-r 的模式下引用到 active_support 呢？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Sat, 08 May 2021 13:41:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/41234</link>
      <guid>https://ruby-china.org/topics/41234</guid>
    </item>
    <item>
      <title>有像 Rails Tutorial 类似的 Go 入门材料吗？</title>
      <description>&lt;p&gt;或者其他推荐的学习资料，想了解下。&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Tue, 07 Apr 2020 09:49:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/39703</link>
      <guid>https://ruby-china.org/topics/39703</guid>
    </item>
    <item>
      <title>Capistrano + Puma + Nginx 部署时遇到点问题</title>
      <description>&lt;p&gt;在尝试部署，其他问题都解决了，剩下这 4 块不知道是哪里出错了导致的。&lt;/p&gt;

&lt;p&gt;执行的 cap production deploy --trace，以下是失败的几处地方 (完整的部署 trace 信息在最后)。希望能得到帮助...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;release 下的 database.yml&lt;/li&gt;
&lt;li&gt;release 下的 assets&lt;/li&gt;
&lt;li&gt;执行 bundle check，提示 missing gems&lt;/li&gt;
&lt;li&gt;shared 下的 puma.pid&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我的 gemfile 如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"http://gems.ruby-china.org"&lt;/span&gt;

&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 5.1.4'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'sqlite3'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'puma'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 3.7'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'sprockets'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'sass-rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 5.0'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'uglifier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;= 1.3.0'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'coffee-rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 4.2'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'turbolinks'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 5'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'jbuilder'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 2.5'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'mysql2'&lt;/span&gt;
&lt;span class="c1"&gt;# Redis&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'redis'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'hiredis'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'redis-namespace'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'redis-objects'&lt;/span&gt;

&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:development&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 3.4.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-bundler'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-rvm'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano3-puma'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'pry-nav'&lt;/span&gt;
  &lt;span class="c1"&gt;# Better Errors&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'better_errors'&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'binding_of_caller'&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'spring'&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'spring-commands-rspec'&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'listen'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 capfile.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'capistrano/setup'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'capistrano/deploy'&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'capistrano/rails'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'capistrano/bundler'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'capistrano/rvm'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'capistrano/puma'&lt;/span&gt;

&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="s1"&gt;'xxx.xxx.xxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;port: &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;roles: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:web&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:db&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="ss"&gt;primary: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:repo_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="s1"&gt;'xxxx@me.git'&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="s1"&gt;'mydemo'&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="s1"&gt;'deploy'&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_threads&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_workers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:pty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:use_sudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:stage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="ss"&gt;:production&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:deploy_via&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;:remote_cache&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:deploy_to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="s2"&gt;"/home/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/production/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:application&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_bind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="s2"&gt;"unix://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/sockets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:application&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-puma.sock"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/pids/puma.state"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/pids/puma.pid"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_access_log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;release_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/log/puma.error.log"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_error_log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;release_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/log/puma.access.log"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:ssh_options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;forward_agent: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;keys: &lt;/span&gt;&lt;span class="sx"&gt;%w(~/.ssh/id_rsa.pub)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_preload_app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_worker_timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:puma_init_active_record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;  &lt;span class="c1"&gt;# Change to true if using ActiveRecord&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:linked_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:linked_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'config/database.yml'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:shared_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:shared_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tmp'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:puma&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'Create Directories'&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:make_dirs&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"mkdir &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/sockets -p"&lt;/span&gt;
      &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"mkdir &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/pids -p"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="ss"&gt;:start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:make_dirs&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:compile_assets&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"cd &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"RAILS_ENV=production bundle exec rails assets:precompile"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:deploy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'Initial Deploy'&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:initial&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="s1"&gt;'deploy:restart'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'puma:start'&lt;/span&gt;
      &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="s1"&gt;'deploy'&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'Restart application'&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:restart&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;in: :sequence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;wait: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="s1"&gt;'puma:restart'&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;after&lt;/span&gt;  &lt;span class="ss"&gt;:finishing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="ss"&gt;:compile_assets&lt;/span&gt;
  &lt;span class="n"&gt;after&lt;/span&gt;  &lt;span class="ss"&gt;:finishing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="ss"&gt;:cleanup&lt;/span&gt;
  &lt;span class="n"&gt;after&lt;/span&gt;  &lt;span class="ss"&gt;:finishing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="ss"&gt;:restart&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是报错的地方&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:symlink:shared &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Execute deploy:symlink:shared
&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:symlink:linked_files &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Execute deploy:symlink:linked_files
 DEBUG[66b3913f] Running &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/config/database.yml &lt;span class="o"&gt;]&lt;/span&gt; on xxx.xxx.xxx
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;66b3913f] Command: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/config/database.yml &lt;span class="o"&gt;]&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;66b3913f] Finished &lt;span class="k"&gt;in &lt;/span&gt;0.154 seconds with &lt;span class="nb"&gt;exit &lt;/span&gt;status 1 &lt;span class="o"&gt;(&lt;/span&gt;failed&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;6813fe7a] Running &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/config/database.yml &lt;span class="o"&gt;]&lt;/span&gt; on xxx.xxx.xxx
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;6813fe7a] Command: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/config/database.yml &lt;span class="o"&gt;]&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;6813fe7a] Finished &lt;span class="k"&gt;in &lt;/span&gt;0.155 seconds with &lt;span class="nb"&gt;exit &lt;/span&gt;status 1 &lt;span class="o"&gt;(&lt;/span&gt;failed&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;

&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:symlink:linked_dirs &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Execute deploy:symlink:linked_dirs
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;89e2dc88] Running &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/public/assets &lt;span class="o"&gt;]&lt;/span&gt; on xxx.xxx.xxx
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;89e2dc88] Command: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/public/assets &lt;span class="o"&gt;]&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;89e2dc88] Finished &lt;span class="k"&gt;in &lt;/span&gt;0.155 seconds with &lt;span class="nb"&gt;exit &lt;/span&gt;status 1 &lt;span class="o"&gt;(&lt;/span&gt;failed&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;38254a1e] Running &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/public/assets &lt;span class="o"&gt;]&lt;/span&gt; on xxx.xxx.xxx
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;38254a1e] Command: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057/public/assets &lt;span class="o"&gt;]&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;38254a1e] Finished &lt;span class="k"&gt;in &lt;/span&gt;0.155 seconds with &lt;span class="nb"&gt;exit &lt;/span&gt;status 1 &lt;span class="o"&gt;(&lt;/span&gt;failed&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;

&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:updated &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Invoke bundler:install &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Execute bundler:install
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3] Command: &lt;span class="nb"&gt;cd&lt;/span&gt; /home/deploy/production/mydemo/releases/20180223075057 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ~/.rvm/bin/rvm default &lt;span class="k"&gt;do &lt;/span&gt;bundle check &lt;span class="nt"&gt;--path&lt;/span&gt; /home/deploy/production/mydemo/shared/bundle
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3]   The following gems are missing
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3]   
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3]    &lt;span class="k"&gt;*&lt;/span&gt; coderay &lt;span class="o"&gt;(&lt;/span&gt;1.1.2&lt;span class="o"&gt;)&lt;/span&gt;
...
&lt;span class="o"&gt;(&lt;/span&gt;此处说有几个gems缺失&lt;span class="o"&gt;)&lt;/span&gt;
...
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3]   Install missing gems with &lt;span class="sb"&gt;`&lt;/span&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3]   
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;13b118d3] Finished &lt;span class="k"&gt;in &lt;/span&gt;0.873 seconds with &lt;span class="nb"&gt;exit &lt;/span&gt;status 1 &lt;span class="o"&gt;(&lt;/span&gt;failed&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;

&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:compile_assets 
&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:cleanup 
&lt;span class="k"&gt;**&lt;/span&gt; Invoke deploy:restart &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Execute deploy:restart
&lt;span class="k"&gt;**&lt;/span&gt; Invoke puma:restart &lt;span class="o"&gt;(&lt;/span&gt;first_time&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; Execute puma:restart
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;7cb84c39] Running &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /home/deploy/production/mydemo/shared/tmp/pids/puma.pid &lt;span class="o"&gt;]&lt;/span&gt; on xxx.xxx.xxx
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;7cb84c39] Command: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /home/deploy/production/mydemo/shared/tmp/pids/puma.pid &lt;span class="o"&gt;]&lt;/span&gt;
 DEBUG &lt;span class="o"&gt;[&lt;/span&gt;7cb84c39] Finished &lt;span class="k"&gt;in &lt;/span&gt;0.157 seconds with &lt;span class="nb"&gt;exit &lt;/span&gt;status 1 &lt;span class="o"&gt;(&lt;/span&gt;failed&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>wdrsam</author>
      <pubDate>Fri, 23 Feb 2018 16:09:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/35059</link>
      <guid>https://ruby-china.org/topics/35059</guid>
    </item>
    <item>
      <title>再次请求同一域名下不同接口遇到的问题，寻求帮助</title>
      <description>&lt;p&gt;rails4.2, ruby2.2.0
在控制器中，请求过来后，将生成一些参数，再访问一次本域名下的其他接口。
例：a 请求 &lt;a href="http://www.xxx.com/api/test" rel="nofollow" target="_blank" title=""&gt;www.xxx.com/api/test&lt;/a&gt;, 生成一些参数，用 mechanize 把请求包装好（请求部分代码确定没错），访问 www.xxx.com/api/test1&lt;/p&gt;

&lt;p&gt;这时会卡顿个 1 分钟，报下面的错&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Net::ReadTimeout - Net::ReadTimeout:
  /Users/qianfandu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/protocol.rb:158:in &lt;span class="sb"&gt;`&lt;/span&gt;rescue &lt;span class="k"&gt;in &lt;/span&gt;rbuf_fill&lt;span class="s1"&gt;'
...
...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;奇怪的是，在报错完后，a 请求最终触发 api/test1 里设置的断点，也就是最终请求成功了。但为什么会卡顿这么久，是跟某些安全机制有关吗？有没有什么办法可以避免...&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Thu, 26 Oct 2017 10:43:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/34433</link>
      <guid>https://ruby-china.org/topics/34433</guid>
    </item>
    <item>
      <title>视频上传后，paperclip-av-transcoder 剪切出来的视频无法在 web 正常播放</title>
      <description>&lt;p&gt;代码肯定没问题。当上传视频后（小于 5MB），会按 model 理申明的去剪切，一个 original.mp4，一个是 medium.mp4。这两个视频除了长宽不一样，其他都是正常的，能够在本地播放器中播放。&lt;/p&gt;

&lt;p&gt;通过 web 上渲染后取得视频的地址，&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:3000/uploads/X/XX/video/8/original.mp4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个地址可以正常在 web 中播放&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:3000/uploads/X/XX/video/8/meduim.mp4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;却无法在 web 中播放。但是如果找到这个 mediumn.mp4 的文件地址，在 chrome 中打开这个地址，放在 web 中就正常播放了，唯一不同的至少 src 中指向的地址。&lt;/p&gt;

&lt;p&gt;为什么 medium 就无法在 web 中播放？就是好像完全没载入这个视频文件的样子。点了播放什么反应也没。
都是在本地测试的。&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Mon, 04 Sep 2017 16:50:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/34019</link>
      <guid>https://ruby-china.org/topics/34019</guid>
    </item>
    <item>
      <title>6月 就毕业了，想了解下市场情况</title>
      <description>&lt;p&gt;第一份工作，之前没有工作经验。在刚开始工作不到 2 周总监就找我，说毕业后继续待这可以给 5k 到 6k 左右（那时才工作到第二周..）。所以拿毕业证后要求 6k，很合适吧？&lt;/p&gt;

&lt;p&gt;我看拉钩上初级 ruby 开发也基本是 6k 起步。大家怎么看？工作经验快 8 个月&lt;/p&gt;

&lt;p&gt;网上标的薪资一般是睡前还是睡后？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Thu, 28 Apr 2016 21:09:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/29876</link>
      <guid>https://ruby-china.org/topics/29876</guid>
    </item>
    <item>
      <title>用 slim，如何动态给个标签的 class 赋值？</title>
      <description>&lt;p&gt;用 erb 的话可以这样写，&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"alert alert-&amp;lt;%= message_type %&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= message %&amp;gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.alert.alert-= message_type  这样写不对吧。。&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Fri, 22 Apr 2016 10:42:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/29820</link>
      <guid>https://ruby-china.org/topics/29820</guid>
    </item>
    <item>
      <title>I18 翻译问题</title>
      <description>&lt;p&gt;比如
zh:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;zh:
  user: &lt;/span&gt;&lt;span class="n"&gt;用户&lt;/span&gt;

&lt;span class="c1"&gt;# 在en里&lt;/span&gt;
&lt;span class="ss"&gt;en:
  user: &lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就会报错，如果想要两个语言版本该怎么做呢...难道不是同一个消息对象指定不同的语言版本翻译，看 locale 参数是哪个就用哪个么/..&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Fri, 22 Apr 2016 10:10:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/29819</link>
      <guid>https://ruby-china.org/topics/29819</guid>
    </item>
    <item>
      <title>一个下载接口，点击时会被访问，弹出 “确认下载”，点击确认后又会被访问。</title>
      <description>&lt;p&gt;因为要做统计，发现只要有这种确认下载的按钮，那请求就是两次，点击的时候一次，确认的时候一次。除了在控制器 create 之前判断是否有该记录（以 ip 为唯一值）外，还有啥更好的办法？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Tue, 05 Apr 2016 10:48:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/29542</link>
      <guid>https://ruby-china.org/topics/29542</guid>
    </item>
    <item>
      <title>关联里的 class_name 和 foreign_key 不是重复的吗？</title>
      <description>&lt;p&gt;“Rails 会寻找名为 _id 的外键，其中  是模型类名的小写形式。”&lt;/p&gt;

&lt;p&gt;user.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:microposts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;dependent: :destroy&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:active_relationships&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name:  &lt;/span&gt;&lt;span class="s2"&gt;"Relationship"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="ss"&gt;foreign_key: &lt;/span&gt;&lt;span class="s2"&gt;"follower_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="ss"&gt;dependent:   :destroy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;既然可以用 foreign_key 指明外键，那 class_name 有什么用啊？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Fri, 13 Nov 2015 17:56:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/28056</link>
      <guid>https://ruby-china.org/topics/28056</guid>
    </item>
    <item>
      <title>在 Model 里验证一个字段的时候，定制消息可以把消息里的字段名定制了吗？</title>
      <description>&lt;p&gt;比如 name 字段，用:message 后，前面还是会输出字段的名字。怎么把它去掉或者改成其他的？&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Tue, 03 Nov 2015 18:00:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/27936</link>
      <guid>https://ruby-china.org/topics/27936</guid>
    </item>
    <item>
      <title>社区有的帖子后面的回复量是灰色的，和蓝色的有什么区别吗？</title>
      <description>&lt;p&gt;一直好奇，但又没发现区别。。。。&lt;/p&gt;</description>
      <author>wdrsam</author>
      <pubDate>Tue, 03 Nov 2015 16:08:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/27933</link>
      <guid>https://ruby-china.org/topics/27933</guid>
    </item>
  </channel>
</rss>
