<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zxzllyj (独孤青冥)</title>
    <link>https://ruby-china.org/zxzllyj</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>转职成功，特来吹吹水</title>
      <description>&lt;p&gt;已成功转职成老师，教计算机网络，不干程序员啦。祝各位还奋斗在一线的那啥，那啥，那啥&lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;/p&gt;</description>
      <author>zxzllyj</author>
      <pubDate>Sat, 25 Feb 2017 14:12:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/32380</link>
      <guid>https://ruby-china.org/topics/32380</guid>
    </item>
    <item>
      <title>各位谁知道有什么比较好用的开源邮件系统</title>
      <description>&lt;h4 id="最近打算搞一个邮局系统，大概200人用，需要有企业邮局的功能，比如联系人，群组，邮件组等等企业常用的功能，但是找了一圈发现似乎没有？各位有什么推荐的吗？要有用rails写的更好，这样我就可以自由修改了"&gt;最近打算搞一个邮局系统，大概 200 人用，需要有企业邮局的功能，比如联系人，群组，邮件组等等企业常用的功能，但是找了一圈发现似乎没有？各位有什么推荐的吗？要有用 rails 写的更好，这样我就可以自由修改了&lt;/h4&gt;</description>
      <author>zxzllyj</author>
      <pubDate>Fri, 24 Feb 2017 19:24:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/32377</link>
      <guid>https://ruby-china.org/topics/32377</guid>
    </item>
    <item>
      <title>Rails Model 中 has_one 关系如何加载 conditions</title>
      <description>&lt;p&gt;如题:
遇上这样一个问题，存在三个表:user namespace group 其中，group 是单表继承的 namespace ,通过在其中，user 和 namespace 的对应关系为 has_one,  user 与 group 的关系为 has_many
因为业务调整，先在需要将 namespace 中的 type 字段调整为 group，然后新增一个 namespace 给用户，就出现了这样一个问题：修改为 group 后 group 的 id 比 namespace 的 id 要小
这就导致通过关系查询 user 的 namespace 查找出的是 group 的问题，其生成的 sql 如下：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;`namespaces`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;`namespaces`&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nv"&gt;`namespaces`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;用户&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&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;has_one&lt;/span&gt; &lt;span class="ss"&gt;:namespace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;dependent: :destroy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;foreign_key: :owner_id&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;"Namespace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;conditions: &lt;/span&gt;&lt;span class="s1"&gt;'type IS NULL'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;明显，限制条件 type is NULL 没有生效，但是，如果将 has_one 改为 has_many 限制条件就生效了&lt;/p&gt;

&lt;p&gt;请问，如何才能是 has_one 的限制条件生效
通过 google 和查询文档，确定 conditions=&amp;gt;{:type=&amp;gt; nil}这样的写法支持但并未生效，该文档指定的 rails 版本为 3.2.13
注：我的 rails 版本是 3.2.16&lt;/p&gt;</description>
      <author>zxzllyj</author>
      <pubDate>Tue, 05 Apr 2016 18:14:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/29549</link>
      <guid>https://ruby-china.org/topics/29549</guid>
    </item>
    <item>
      <title>请问路由中一个地址有两个不同的控制器该怎么正确处理 [需求变更,已解决]</title>
      <description>&lt;p&gt;rails 开发，今天遇上了一个蛋疼的问题，原本有一个 /user 的路由，是用来对用户进行操作的，包括注册用户，显示用户详细信息等等一系列操作，然后上头来了个需求，将原本有的一个功能链接变一下，由原本的/path/name 变成/name，造成的结果就是 两个不同的玩意链接地址是一样的，因为用户的路由写在前面，会先识别为用户，然后用户的控制器中做了跳转，这样就搞成了死循环，同理，其他操作也是，那么，现在有啥子办法可以将链接指向正确的地方而不是不停地跳转？&lt;/p&gt;

&lt;p&gt;注：已有那种笨办法，即在用户的控制器中写个 if，每个都写，但这样我不觉得是一种好办法....&lt;/p&gt;</description>
      <author>zxzllyj</author>
      <pubDate>Wed, 30 Mar 2016 14:31:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/29506</link>
      <guid>https://ruby-china.org/topics/29506</guid>
    </item>
    <item>
      <title>关于 ruby 的 timeout 超时控制</title>
      <description>&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="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;page_check&lt;/span&gt;
   &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pages&lt;/span&gt; &lt;span class="c1"&gt;#读取配置文件中页面的地址&lt;/span&gt;
    &lt;span class="n"&gt;pages&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;page&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
          &lt;span class="k"&gt;begin&lt;/span&gt;
            &lt;span class="no"&gt;RestClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vc"&gt;@@domain&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&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;respose&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;respose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
              &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"页面检测失败，页面地址为：http://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vc"&gt;@@domain&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&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;respose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;colorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:red&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
              &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"页面&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;检测通过"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;colorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:green&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;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;TimeoutError&lt;/span&gt;
        &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"页面检测超时，页面地址为：http://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vc"&gt;@@domain&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;colorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:yellow&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;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码的作用就是检查网站的页面，在更新时用来检查是不是所有的页面都可用。
看起来好给力的样子，有 http 状态码检查，有超时控制，似乎非常完美了，然而，这段代码跑起来经常因为超时错误而中断，是的，你没看错，超时！！！代码中明明有捕获超时异常并且处理的代码，但脚本却因为超时而中断
报的错误日志如下：
&lt;img src="https://l.ruby-china.com/photo/2015/7ba3c8c4c86dc440afa68390a9055038.jpg" title="" alt=""&gt;
百思不得其解，然后使劲翻文档，翻官方解释，最后总结出 ruby 的 timeout 针对的是代码块，也就是说整个 timeout 作用范围的代码加起来只能运行设定的时常，超过了才会报错误，但是，如果说代码块中某一句在还没到设定时间时报了超时，那么异常还是异常，timeout 并不给予处理，比如本段代码中使用到了 restclient 这个 gem 包，他报的超时 timeout 并不会处理，而是如实的打印出来并终止程序，这也就是明明我们设定了 timeout 但还是报超时异常的原因
而对于这个问题的原因，结合官方文档，给出如下猜测：ruby 的 timeout 是通过线程实现的，他将设定的代码块弄到一个线程里去执行，然后本身暂停，等待设定的时间到比如 5 秒钟后取检测这个线程还在不在，如果还在就报超时并干掉这个线程，不在了就正常执行（注意，也可能是 timeout 是线程，代码块是主进程，这个观点来源于猜测，不具备权威性）。所以对于这段代码报超时的问题，我们不能再指望本身的 timeout，结合错误日志，很明显，超时的是 restclient，所以应该给 restclient 设定一个超时时间，然而，对 restclient 设定 timeout 是不现实的，因为 ruby 的 timeout 并不会管代码本身如何，他只会判断代码还有没有在执行，故只能在 restclient 上设定超时，当然，如何设定 restclient 的超时时间那是另一个问题了，本文讲的是 ruby 的 timeout，所以这里不再讲 restclient 的 timeout
当然，具体的指明 ruby 的 timeout 运行机制以及代码阅读我就不参合了。
所以，ruby 的 timeout 在有网络请求的时候就是一个坑啊！！！
好吧，我知道有点水，新人第一次发帖，如果帖子有问题麻烦管理员帮忙编辑调整一下&lt;/p&gt;</description>
      <author>zxzllyj</author>
      <pubDate>Wed, 11 Nov 2015 15:52:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/28019</link>
      <guid>https://ruby-china.org/topics/28019</guid>
    </item>
  </channel>
</rss>
