<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zzxworld (zixing chung)</title>
    <link>https://ruby-china.org/zzxworld</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>使用 CarrierWave 实现字符串方式的文件上传</title>
      <description>&lt;p&gt;在 Rails 中使用 CarrierWave 实现常规的上传功能很容易。但如果有了特殊需求时，就需要一些小技巧来解决了。例如我今天遇到的一个问题就是要把存储在 SQLite 数据包中字符串格式的图片数据导入到 Rails 项目的数据库中。&lt;/p&gt;

&lt;p&gt;查看 CarrierWave 的文档了解到，使用它关联的模型字段可以接受文件格式的值。例如下面这个用户头像的模型定义：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;mount_uploader&lt;/span&gt; &lt;span class="ss"&gt;:avatar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;AvatarUploader&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 ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;avatar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/path/avatar.jpg'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但翻遍了文档，并没有发现可以使用字符串的方式赋值。手动实验了一下，证明确实是不可以的。所以只能以文件的方式来解决。&lt;/p&gt;

&lt;p&gt;以文件的方式貌似也很好解决。把 SQLite 中字符串格式的图片内容先保存成文件，然后再使用这个存储的文件地址就可以了。如果要简单点，还可以使用 &lt;code&gt;Tempfile&lt;/code&gt; 对象。但这不是一个简洁优雅的方式，我希望能够省略掉保存文件的这一步。在翻阅了 CarrierWave 的 Wiki 后，我找到了这篇文章：&lt;a href="https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Upload-from-a-string-in-Rails-3-or-later" rel="nofollow" target="_blank" title=""&gt;How to: Upload from a string in Rails 3 or later&lt;/a&gt;，这正是我需要的解决方式。按照其中介绍，我也实现了一个自己的 &lt;code&gt;StringFile&lt;/code&gt; 类：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StringFile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;StringIO&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="vi"&gt;@filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;original_filename&lt;/span&gt;
    &lt;span class="vi"&gt;@filename&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码跟 wiki 中的例子基本雷同，但存放的位置不一样。我把这个类放到了 lib 目录中。原因是我只在自定义终端命令中使用它，所以没必要全局加载。最后还是以用户头像的模型举例，它的使用方式如下：&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;'string_file'&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;avatar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;StringFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'face.jpg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;face_raw_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zzxworld</author>
      <pubDate>Tue, 21 Mar 2017 17:36:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/32598</link>
      <guid>https://ruby-china.org/topics/32598</guid>
    </item>
    <item>
      <title>Mac 开发环境下大量的 fsevent_watch 进程</title>
      <description>&lt;p&gt;几天前注意到这个现象的，进程都是 &lt;code&gt;fsevent_watch&lt;/code&gt;，执行 &lt;code&gt;ps aux|grep ruby&lt;/code&gt;，结果如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zzxworld         45397   0.0  0.0  2453092   1204   ??  S     4:03PM   0:00.01 /Users/zzxworld/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/rb-fsevent-0.9.8/bin/fsevent_watch --latency 0.1 /Users/zzxworld/Projects/blog/src/test/mailers
zzxworld         45394   0.0  0.0  2452068   1196   ??  S     4:03PM   0:00.01 /Users/zzxworld/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/rb-fsevent-0.9.8/bin/fsevent_watch --latency 0.1 /Users/zzxworld/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/devise-4.2.0/app/controllers
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但此时我并没有执行任何的 &lt;code&gt;rails&lt;/code&gt; 命令，而且每次 &lt;code&gt;rails s&lt;/code&gt; 后也是正常 &lt;code&gt;Ctrl + C&lt;/code&gt; 结束了的。这些 &lt;code&gt;fsevent_watch&lt;/code&gt; 进程少的话有二十多个，多的时候能有六七十个。每次都是发现后手动 &lt;code&gt;pkill fsevent_watch&lt;/code&gt; 来关闭这些进程。有没有碰到同样问题的朋友？麻烦分享一下你们的解决方法。&lt;/p&gt;</description>
      <author>zzxworld</author>
      <pubDate>Mon, 20 Mar 2017 11:45:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/32581</link>
      <guid>https://ruby-china.org/topics/32581</guid>
    </item>
    <item>
      <title>Rails Time.zone.now 性能小增</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/rails/rails/pull/26359" rel="nofollow" target="_blank"&gt;https://github.com/rails/rails/pull/26359&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Warming up --------------------------------------
            Time.now   127.923k i/100ms
       Time.zone.now    10.275k i/100ms
Calculating -------------------------------------
            Time.now      1.946M (± 5.9%) i/s -      9.722M in   5.010236s
       Time.zone.now    106.625k (± 4.3%) i/s -    534.300k in   5.020343s

Comparison:
            Time.now:  1946220.1 i/s
       Time.zone.now:   106625.5 i/s - 18.25x slower
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zzxworld</author>
      <pubDate>Fri, 14 Oct 2016 09:34:50 +0800</pubDate>
      <link>https://ruby-china.org/topics/31321</link>
      <guid>https://ruby-china.org/topics/31321</guid>
    </item>
    <item>
      <title>也许是 Chrome 的一个 Bug，求测试</title>
      <description>&lt;h3 id="环境"&gt;环境&lt;/h3&gt;
&lt;p&gt;系统：OS X EI Capitan
Chrome: Version 51.0.2704.106 (64-bit)
Rails: 5.0.0&lt;/p&gt;

&lt;p&gt;创建任意 Rails 环境，使 &lt;a href="http://localhost:3000/" rel="nofollow" target="_blank"&gt;http://localhost:3000/&lt;/a&gt; 能访问即可。&lt;/p&gt;
&lt;h3 id="问题"&gt;问题&lt;/h3&gt;
&lt;p&gt;把链接换成 &lt;a href="http://localhost:3000/?%E7%8E%8B%E4%B8%B9" rel="nofollow" target="_blank" title=""&gt;http://localhost:3000/?王丹&lt;/a&gt;，Chrome 会显示 &lt;strong&gt;"The localhost page isn’t working"&lt;/strong&gt; 页面。Rails 开发运行终端也没有显示任何网络请求信息。但我换成 Safari 访问这个链接就没问题。目前还不知道是我个人电脑环境的问题，还是 Chrome 的 Bug，望有空的朋友验证一下。&lt;/p&gt;</description>
      <author>zzxworld</author>
      <pubDate>Thu, 28 Jul 2016 17:54:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/30663</link>
      <guid>https://ruby-china.org/topics/30663</guid>
    </item>
  </channel>
</rss>
