<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>thxagain (thxagain)</title>
    <link>https://ruby-china.org/thxagain</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>请教接口设计规范问题</title>
      <description>&lt;p&gt;今天看到同事设计的接口（Java）：&lt;/p&gt;

&lt;p&gt;新增数据和更新数据是同一个接口，仅仅是根据参数不同（新增没有主键 id，更新有 id），在 service 里的逻辑用 if else 区分开来。&lt;/p&gt;

&lt;p&gt;他给出的理由是，因为请求参数差不多，service 逻辑中有重合的部分（比如校验参数），返回值也是一样的，所以就放在一起了。&lt;/p&gt;

&lt;p&gt;我想问问大家这种设计风格常见么，他说之前呆的公司里都是这么设计的。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Fri, 15 Feb 2019 16:13:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/38114</link>
      <guid>https://ruby-china.org/topics/38114</guid>
    </item>
    <item>
      <title>为什么 Rails 中没有依赖注入的概念？</title>
      <description>&lt;p&gt;最近在做一个 Spring 项目，看到 Spring 中的 AOP 功能，感觉和 Rails 中的&lt;code&gt;before_action&lt;/code&gt;很类似。&lt;/p&gt;

&lt;p&gt;但是看到依赖注入、控制反转的概念，却发现很难在 Rails 框架中找到相应的组件/功能，这是为什么呢？&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Sat, 04 Mar 2017 20:12:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/32442</link>
      <guid>https://ruby-china.org/topics/32442</guid>
    </item>
    <item>
      <title>Ruby 方法的默认调用对象</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test.jpg'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我注意到没有用&lt;code&gt;open&lt;/code&gt;这个方法前面没有任何对象，想请问下是哪个对象调用了&lt;code&gt;open&lt;/code&gt;这个方法呢？是&lt;code&gt;Object&lt;/code&gt;么？&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Tue, 06 Dec 2016 16:19:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/31813</link>
      <guid>https://ruby-china.org/topics/31813</guid>
    </item>
    <item>
      <title>Sidekiq worker 中调用 Java</title>
      <description>&lt;p&gt;是这样的，之前有看到论坛有分享，关于使用 go 重写了 sidekiq 的 worker，使用到了&lt;a href="https://github.com/jrallison/go-workers" rel="nofollow" target="_blank" title=""&gt;开源的工程&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;我现在的需求是：异步队列中需要调用公司的云服务，SDK 只有 Java Python Go...没有 Ruby&lt;/p&gt;

&lt;p&gt;现在想的方案是，要么使用 Ruby 自己写一套 SDK，要么把 sidekiq 的 worker 改为 Java 去实现&lt;/p&gt;

&lt;p&gt;如果有现成的 Java 版 sidekiq 的 worker 实现，那么方案二可能是最快的，但是一时又没有搜索到，所以想问问大家的建议。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Mon, 05 Dec 2016 11:34:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/31798</link>
      <guid>https://ruby-china.org/topics/31798</guid>
    </item>
    <item>
      <title>设备分配的问题</title>
      <description>&lt;p&gt;已经得到待分配的设备 id 数组：&lt;code&gt;[2,3,4]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;目前已有两个设备 id 数组：&lt;code&gt;[1,2,3]&lt;/code&gt;和&lt;code&gt;[4,5,6]&lt;/code&gt;代表每组中已经使用过的设备&lt;/p&gt;

&lt;p&gt;要求是找到一组 id，满足：在已有的设备 id 数组中均没有出现过，例如：第一组分配 4 号设备，第二组分配 2 或 3 号设备&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;再比如待分配的设备 id 数组是：&lt;code&gt;[1,2,3]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;已有的两个已经使用过的设备 id 数组分别为&lt;code&gt;[1,2]&lt;/code&gt;和&lt;code&gt;[2,1]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;那么现在就找不到一组能满足条件的 id 了&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;实际项目中遇到的问题，想请教下大家解决这个问题的编程思路。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Tue, 15 Nov 2016 15:00:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/31601</link>
      <guid>https://ruby-china.org/topics/31601</guid>
    </item>
    <item>
      <title>Ruby 中读取大文件</title>
      <description>&lt;p&gt;类似&lt;code&gt;File.open&lt;/code&gt;背后具体做了什么事情呢？&lt;/p&gt;

&lt;p&gt;我很好奇假设一个文件有 2G 大，那么会把它一次性读入内存中么？&lt;/p&gt;

&lt;p&gt;类似这样写是否就可以做到只读取指定行号的文件内容了：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;file&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="n"&gt;log_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;log_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logcat_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@filter_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@filter_tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_file_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;log_file_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="c1"&gt;# 只读取start_line到end_line的数据&lt;/span&gt;
    &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;start_line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;start_line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;end_line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;end_line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;

    &lt;span class="n"&gt;log_file_content&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;log_file_content&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>thxagain</author>
      <pubDate>Wed, 09 Nov 2016 16:54:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/31559</link>
      <guid>https://ruby-china.org/topics/31559</guid>
    </item>
    <item>
      <title>Gzip 压缩之后如何解压</title>
      <description>&lt;p&gt;Hi ALL&lt;/p&gt;

&lt;p&gt;在和客户端联调，客户端把内容压缩了，我遇到了 HTTP 请求头大概是长这个样子的，我该如何解压呢。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Content-Type: multipart/form-data; boundary=8b612ae9-1e28-40b1-9bd2-eaebe2103643
Connection: Keep-Alive
X-Atlassian-Token: nocheck
Content-Encoding: gzip
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2;)
Accept-Encoding: gzip
Content-Length: 31419
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我现在 Console 的结果是&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rack app error handling request 
#&amp;lt;EOFError: EOFError&amp;gt;
/home/gems/rack-2.0.1/lib/rack/multipart/parser.rb:361:in `handle_empty_content!'


&lt;/code&gt;&lt;/pre&gt;</description>
      <author>thxagain</author>
      <pubDate>Tue, 27 Sep 2016 21:06:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/31180</link>
      <guid>https://ruby-china.org/topics/31180</guid>
    </item>
    <item>
      <title>客户端通过 Rails API 上传图片</title>
      <description>&lt;p&gt;Hi All&lt;/p&gt;

&lt;p&gt;我现在在做一个 Rails API，iOS 客户端调用我的 API 可以将图片上传到云端。&lt;/p&gt;

&lt;p&gt;看了一圈一般是使用 carrierwave 来实现，可是由于云端（不是又拍云 阿里云）是公司内部的，没有对应的 carrierwave 上传 gem。&lt;/p&gt;

&lt;p&gt;我想到的流程是，通过 API 先将图片保存在 server 端，然后再从 server 端手动上传到云端。想请问一下大家是这么一个流程么？&lt;/p&gt;

&lt;p&gt;如果我的理解没错的话，那似乎也不需要 carrierwave 了？&lt;/p&gt;

&lt;p&gt;因为我看了 Rails Guides：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;uploaded_io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:attachments&lt;/span&gt;&lt;span class="p"&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="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'public'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'uploads'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uploaded_io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;original_filename&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'wb'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uploaded_io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就可以保存在 server 端了，然后手动发一个 post 请求，将 server 端的图片放到云端就 OK 了。对不对？我没有弄复杂吧？&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Sun, 07 Aug 2016 20:22:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/30759</link>
      <guid>https://ruby-china.org/topics/30759</guid>
    </item>
    <item>
      <title>移动端 API 压缩问题</title>
      <description>&lt;p&gt;例如一个 api 是提供给移动端的：&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/gists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"the description for this gist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"public"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"file1.txt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String file contents"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有必要为了节省传输压缩一下么，
例如将&lt;code&gt;description&lt;/code&gt;换成&lt;code&gt;des&lt;/code&gt;？&lt;/p&gt;

&lt;p&gt;另外还有一个问题，比如一个普通的 ruby class，class 内可能会有 10 多个属性，new 出 100 个对象，大概会占用多少内存呢？怎么推算呢？&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Wed, 27 Jul 2016 19:19:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/30648</link>
      <guid>https://ruby-china.org/topics/30648</guid>
    </item>
    <item>
      <title>Rails 日志显示的疑问</title>
      <description>&lt;p&gt;同样是开发环境下，我的日志长这个样子：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Started GET "/projects/369" for 123.58.191.68 at 2016-04-07 20:37:32 +0800
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同事的日志今天看了下，大致是这个样子的：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[info]Started GET "/projects/369" for 123.58.191.68 at 2016-04-07 20:37:32 +0800
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样用 p 打印一个对象，我会输出详细的信息：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#&amp;lt;ActionDispatch::Http::Headers:0x0000000936e328 @env={"GATEWAY_INTERFACE"=&amp;gt;"CGI/1.1", "PATH_INFO"=&amp;gt;"/device_appointments/index", "QUERY_STRING"=&amp;gt;"", "REMOTE_ADDR"=&amp;gt;"127.0.0.1", "REMOTE_HOST"=&amp;gt;"127.0.0.1"....后面还有很多&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同事的只会有很少的一点：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[info]#&amp;lt;ActionDispatch::Http::Headers:0x0000000936e328&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;想请教一下大家，这个是在哪里设置的呀&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Thu, 07 Apr 2016 20:41:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/29620</link>
      <guid>https://ruby-china.org/topics/29620</guid>
    </item>
    <item>
      <title>同一个 �URL 根据设定表现出不同的业务逻辑</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sample_method&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我现在有这么一个需求，实现一个 api server：
用户访问的 url 是同一个：&lt;code&gt;host/sample_method&lt;/code&gt;，
但是需要根据用户的设定，表现出不同的业务逻辑。&lt;/p&gt;

&lt;p&gt;我想了一个办法：
首先提供给用户一个类似设定参数的接口：&lt;code&gt;host/setting?status=1&lt;/code&gt;
在访问&lt;code&gt;host/sample_method&lt;/code&gt;之前实现访问这个设定参数的接口设定下需要表现出的业务逻辑，
把参数保存在一个全局变量中，然后修改代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sample_method&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;全局变量&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;逻辑1&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;逻辑2&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;现在遇到的问题是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;实现方案有没有可以改进的地方？【用户访问的 url 已经是固定的了，不能变动】&lt;/li&gt;
&lt;li&gt;全局变量存哪里呢？当前的 api server 没有数据库，存内存中，用$开头的全局变量么？&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>thxagain</author>
      <pubDate>Thu, 25 Feb 2016 14:39:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/29095</link>
      <guid>https://ruby-china.org/topics/29095</guid>
    </item>
    <item>
      <title>什么时候进行异常捕获</title>
      <description>&lt;p&gt;Ruby 提供了一种 begin resuce 的简便写法：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method1&lt;/span&gt;
  &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;do_something&lt;/span&gt;
  &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="c1"&gt;#catch exception&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;可以简写为：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method1&lt;/span&gt;
  &lt;span class="n"&gt;do_something&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="c1"&gt;#catch exception&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method1&lt;/span&gt;
  &lt;span class="n"&gt;do_something&lt;/span&gt;
  &lt;span class="n"&gt;do_another_thing&lt;/span&gt; 
  &lt;span class="c1"&gt;# 20+ lines of code&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="c1"&gt;#catch exception&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但我觉得这是一种不好的实践，可能会隐藏掉很多 bug，举个例子：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
  &lt;span class="vi"&gt;@book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
  &lt;span class="vi"&gt;@book_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@book.name&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# undefined method `name' for nil:NilClass&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虽然这里把这个&lt;code&gt;no method error&lt;/code&gt;捕获住了，页面可能并不会挂掉，其实数据是有问题的。但如果不仔细看 log，可能就忽视了这行错误的代码。
想问问大家对于这种代码风格有什么看法。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Mon, 01 Feb 2016 14:27:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/28924</link>
      <guid>https://ruby-china.org/topics/28924</guid>
    </item>
    <item>
      <title>在 Rails 的 action 中新建 Thread</title>
      <description>&lt;p&gt;我想在 action 中新建一个线程，跑后台任务。&lt;/p&gt;

&lt;p&gt;于是直接&lt;code&gt;Thread.new&lt;/code&gt;加一个&lt;code&gt;block&lt;/code&gt;包裹住我希望后台运行的 code，项目也能够正常运行。&lt;/p&gt;

&lt;p&gt;但是我记得之前听了 RubyConf 上有同学分享过，说直接在 Rails 工程里起 Thread 并不好。&lt;/p&gt;

&lt;p&gt;我想请教一下大家这样的写法不好在哪里呢？能否举一些例子或者提供些文章参考一下。&lt;/p&gt;

&lt;p&gt;我搜索了一下，似乎比较通用的做法是这里使用&lt;code&gt;Resque&lt;/code&gt;或者&lt;code&gt;Sidekiq&lt;/code&gt;起一个后台任务运行起来，刚好 Rails 也提供了&lt;code&gt;ActiveJob&lt;/code&gt;模块统一封装了接口。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Tue, 26 Jan 2016 23:44:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/28872</link>
      <guid>https://ruby-china.org/topics/28872</guid>
    </item>
    <item>
      <title>接口的功能粒度</title>
      <description>&lt;p&gt;Hi 大家好，我又来啦。
这次是想讨论一下接口设计的功能粒度。&lt;/p&gt;

&lt;p&gt;假设我有两张表，&lt;code&gt;books&lt;/code&gt;图书概要表以及&lt;code&gt;book_details&lt;/code&gt;图书详情表。
例如有这么一个需求：录入图书，如果是外文书，可能只录入概要就可以了，如果是中文书，还要录入图书详情。
那我是应该提供两个接口：&lt;code&gt;POST /books&lt;/code&gt; 以及&lt;code&gt;POST /book_details&lt;/code&gt;，让接口调用方根据自己的需求调用，
还是应该提供一个接口： &lt;code&gt;POST /books_instore&lt;/code&gt;呢？&lt;/p&gt;

&lt;p&gt;我仔细想了想，似乎两种做法都有道理：
第一种做法符合 REST 风格，接口作用单一，逻辑上比较清晰。
第二种做法呢，减少了接口调用方的工作，并且只有一次请求，减少了网络传输的时间。&lt;/p&gt;

&lt;p&gt;那万一有更复杂的情况，如果一个需求，既包含了 POST 创建，又包含了 PUT 更新操作，还可能会有 DELETE，是应该用一个接口实现它呢，还是三个接口呢？&lt;/p&gt;

&lt;p&gt;想请问一下社区里有经验的同学，在接口的功能设计上，粒度的粗细是如何控制的。&lt;/p&gt;

&lt;p&gt;还是说，这种情况是需要根据实际业务情况来看的。
请社区里的同学分享下自己的接口设计经验。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Mon, 11 Jan 2016 14:39:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/28684</link>
      <guid>https://ruby-china.org/topics/28684</guid>
    </item>
    <item>
      <title>Rails API 多条插入数据的设计规范</title>
      <description>&lt;p&gt;假设我有一张 books 表，表中有 id、name、author 3 个字段。
正常的话，我发一个 post 请求： &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/books

# request的body中可以这么写：
book[name]:  aaa
book[author]: bbb

# rails 会自动解析成：
params: { "book" =&amp;gt; { "name" =&amp;gt; "aaa", "author" =&amp;gt; "bbb" } }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那现在，我希望做一个批量插入的 API 接口，可以批量插入 books，&lt;/p&gt;

&lt;p&gt;我就是想知道大家遇到这种情况是怎么设计的，看起来比较规范的 API 接口。&lt;/p&gt;</description>
      <author>thxagain</author>
      <pubDate>Wed, 06 Jan 2016 15:31:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/28627</link>
      <guid>https://ruby-china.org/topics/28627</guid>
    </item>
  </channel>
</rss>
