<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>xwf286 (xue wenfei)</title>
    <link>https://ruby-china.org/xwf286</link>
    <description>做一个程序员</description>
    <language>en-us</language>
    <item>
      <title>关于支付宝 Ruby + RSA 的求助</title>
      <description>&lt;p&gt;公司目前使用的支付宝的接口方式是快捷支付，这种接口使用的是 rsa 加密，网上貌似没有现成的 gem 可用，这个接口的 sdk 有 java c# php 的范例代码，php 和 java 的方式完全不同，java 用的是字符串，php 用的是秘钥文件，研究下来发现 ruby 应该是与 php 相似，经过一番折腾，初步把 rsa 加密搞定（但不知道是否正确）然后调用这个接口返回的结果是，系统繁忙，彻底无语了。
貌似这个坑跨不过去了。同事给的建议是把 java 的代码封装成一个命令行程序，再在 ruby 中调用这个命令行程序。
各位大侠谁有其他好的建议，或者你们谁用 ruby 搞过这个&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Thu, 23 Oct 2014 16:11:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/22215</link>
      <guid>https://ruby-china.org/topics/22215</guid>
    </item>
    <item>
      <title>再次请求一个问题，还是内存溢出</title>
      <description>&lt;p&gt;ActionView::Template::Error (Cannot allocate memory - nodejs /tmp/execjs20140405-19166-gwe01j.js 2&amp;gt;&amp;amp;1
这是什么问题呢？&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Sat, 05 Apr 2014 20:37:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/18425</link>
      <guid>https://ruby-china.org/topics/18425</guid>
    </item>
    <item>
      <title>关于 minimagic 的求救</title>
      <description>&lt;p&gt;在上传图像的时候遇到一个问题:
Errno::ENOMEM (Cannot allocate memory - identify -quiet -ping /tmp/mini_magick20140401-7814-v8r2qm.jpg):
  app/controllers/users_controller.rb:55:in `update'&lt;/p&gt;

&lt;p&gt;这是在生产环境中发生的问题，当我重启 unicorn 的话，暂时没有问题，但过一段时间就不行了&lt;/p&gt;

&lt;p&gt;我用的环境:
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
gem 'rails', '3.2.13'&lt;/p&gt;

&lt;p&gt;哪位大侠能给个提示？&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Tue, 01 Apr 2014 20:08:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/18323</link>
      <guid>https://ruby-china.org/topics/18323</guid>
    </item>
    <item>
      <title>求助关于一个 vagrant 的问题</title>
      <description>&lt;p&gt;有没有办法在 vagrant 虚拟机中使用 capistrano 部署到 vps 上面，
我试了一下，
错误信息如下：
connection failed for: 61.174.13.33 (Net::SSH::AuthenticationFailed: Authentication failed for user   web@61.174.16.33)&lt;/p&gt;

&lt;p&gt;这里的关键是 ssh 使用的是 22 端口，而 vagrant 中会把虚拟机的 22 端口映射到主机的 2222，怎么解决这个问题呢&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Sat, 22 Mar 2014 19:25:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/18097</link>
      <guid>https://ruby-china.org/topics/18097</guid>
    </item>
    <item>
      <title>不要回帖</title>
      <description>&lt;p&gt;我测试一下&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Fri, 14 Mar 2014 13:36:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/17877</link>
      <guid>https://ruby-china.org/topics/17877</guid>
    </item>
    <item>
      <title>JavaScript 的对象本质 (更适合有 java、c++、c# 等背景的)</title>
      <description>&lt;p&gt;javascript 是一个基于对象的语言。
1 如果单单从对象的角度审视 js 的话，她是那么优雅，所有的都是对象，对象就是一个 key-value 集合，对象是动态的，可以动态地增加属性和方法。
2 虽然，每个 js 对象都有一个隐含的到其原型的链接（这个连接是隐藏的，firefox 上可以利用&lt;strong&gt;proto&lt;/strong&gt;看到，对象字面量的原型是 Object.prototype），每个 js 对象都会继承其原型的属性，虽然 javascript 的对象与基于类的语言完全不同，但仍然是很优雅的，不就是一个每个对象有一个原型吗（一直到最顶端）。
。。。。。&lt;/p&gt;

&lt;p&gt;虽然理论上是这样的，但 js 代码中我们不能直接操作这个原型链，即不能 obj2=obj1.&lt;strong&gt;proto&lt;/strong&gt;,如果可以这样的话，确实是够优雅的，但 js 没有这样做，这是 js 的第一个坑，我们称之为&lt;strong&gt;proto&lt;/strong&gt;坑。请参考 java good parts 一书，作者描述为：插入了一个多余的中间层&lt;/p&gt;

&lt;p&gt;3 js 不仅有对象，还有函数 function，除了函数之外居然还有一个 new，一个没有 class 的世界居然有 new，你让大伙怎么想？
接下来我们先看函数，再看 new。
函数初看很简单，就像 c 语言中的方法，由函数名、参数、函数体组成，主要起到封装、重用代码的作用，
但是，js 中的函数可不简单（如果是这么简单就 ok 了）。&lt;/p&gt;

&lt;p&gt;函数也是对象，什么，函数也是对象？在 c 系语言中可不是这样的，函数（方法）是函数（方法），对象是对象，怎么函数也是对象呢？
函数确实是对象，是一种特殊的对象，我们知道，js 中每个对象都是一个键值对集合，还包含一个到其原型的链接，那么函数对象呢？函数对象的原型是 Function.prototype（Function.prototype 本身会连接到 Object.prototype）,此外，函数对象还有两个特殊的隐藏的属性：函数的上下文和执行函数的代码。&lt;/p&gt;

&lt;p&gt;每个函数有一个 prototype 属性（特别注意，这是函数对象特有的属性，不要和 js 中每个对象到其原型的连接相混淆，那个玩意是隐藏的，不过在 firefox 中你可以使用&lt;strong&gt;proto&lt;/strong&gt;访问到），这个 prototype 属性是一个对象，姑且称之为 prototypeObject 吧，这个对象有个 constuctor 属性，指向函数本身，绕了一圈。&lt;/p&gt;

&lt;p&gt;既然函数是对象，那么这个特殊的对象也可以像其他普通的对象那样，可以有属性、有方法，可以被当做参数在函数中传递，。。
这个对象的特殊之处就是"可以被调用"（注意，我在这里加上了括号），可以被调用的含义，就是遇到这类对象你可以直接在对象后面加上一对括号，以及若干参数。（非可调用对象可没有这样的特权）&lt;/p&gt;

&lt;p&gt;回到&lt;strong&gt;proto&lt;/strong&gt;坑上，我们不能直接指定一个对象的原型链，这样的话，怎么实现继承呢（你 javascript 说了，我可以直接实现基于对象的继承，又不提供手段，我怎么实现这个继承呢）？js 提供了一个足够绕 的途径，通过构造函数，也就是通过函数来实现继承，当你 new 一个函数时，这个 new 出来的对象的原型指向函数的 prototype 属性（我们说过，这个属性是一个对象），这样下来确实是够绕的了。&lt;/p&gt;

&lt;p&gt;为什么这样做呢，不是直接操作原型链而是通过一个函数的方式呢？有人（不用说你也知道此人谁了吧）说，js 的发明者对基于原型的继承不太自信，硬生生地搞了个传统面向对象语言中的对象创建方式的模仿品，结果有点成了四不像！！&lt;/p&gt;

&lt;p&gt;再论 this：
在 java 中，也有个 new，这个 new 是和类 class 搭配的，一起合作，创建一个以类为模板的新的对象，&lt;/p&gt;

&lt;p&gt;混乱开始：但是 js 中的这个 new 干嘛用的？和谁搭配用&lt;/p&gt;

&lt;p&gt;在 js 中，函数可以这样用（作为构造函数），即 new 一个函数。&lt;/p&gt;

&lt;p&gt;怪就怪在 new 这个操作，new 的操作实际分两步：
1 创建一个空的对象
2 将新创建的空对象作为 this，调用该函数。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;DogConstructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;respondTo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Woof&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DogConstructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Spot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respondTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rover&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// nope&lt;/span&gt;
&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respondTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Spot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// yeah!&amp;lt;/div&amp;gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码实际上就是：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// create an empty object&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt; 
&lt;span class="c1"&gt;// call the function as a method of the empty object&lt;/span&gt;
&lt;span class="nx"&gt;DogConstructor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Spot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时注意，函数里边有个 this，这个 this 是太动态了，this 指向的就是那个空的对象，这样的话，我们可以通过这种灵活性，可以以函数为模板，创建任意对象。&lt;/p&gt;

&lt;p&gt;最后补充一点，js 设计成这样，我等平庸之辈只能瞻仰的份，对于 c 系程序员来说，这种语言的思维方式需要细细体会，（想想看，java 人渴望的一个 lamda 表达式历经多年还是那么难产），我们需要足够虔诚的态度拥抱这种迥异的语言。&lt;/p&gt;

&lt;p&gt;另外，我想说的是，js 的动态性（她甚至可以修改 this）与函数性以及对象性是相辅相成，三者可以说缺一不可，再想想看，如果不能动态设置 this，函数作为一等公民是不可想象的。&lt;/p&gt;

&lt;p&gt;欢迎大家吐槽！&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Tue, 11 Feb 2014 12:36:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/17164</link>
      <guid>https://ruby-china.org/topics/17164</guid>
    </item>
    <item>
      <title>cayabara 的 feature 测试不是很流行啊</title>
      <description>&lt;p&gt;我查看了几个流行的开源项目：
ruby_china,
diaspora
discourse，
其中 ruby_china 只有一个集成测试，
discourse 目的单元测试和集成测试都做的很好，但没有 feature test
只有 diaspora 的包含 feature test（使用 cucumber）。&lt;/p&gt;

&lt;p&gt;这类涉及到用户与浏览器真实交互的测试真的不需吗？单元测试和集成测试能够覆盖所有的情况吗？特别是那种多用户、情景复杂的情况？有哪位大神能谈谈关于这方面的情况&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Wed, 11 Dec 2013 14:01:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/16135</link>
      <guid>https://ruby-china.org/topics/16135</guid>
    </item>
    <item>
      <title>Ruby under a microscope 第二版一书给人一种醍醐灌顶的感觉</title>
      <description>&lt;p&gt;刚刚开始阅读该书的第二版，真是给人一种醍醐灌顶的感觉，尤其是 lexical scope in ruby 那一节，读了这一节之后，再翻翻元编程那一章，许多概念就迎刃而解了。&lt;/p&gt;

&lt;p&gt;强烈推荐本书，绝对是 6 星级！！！&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Tue, 10 Dec 2013 09:06:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/16107</link>
      <guid>https://ruby-china.org/topics/16107</guid>
    </item>
    <item>
      <title>如何理解元编程中的方法定义？</title>
      <description>&lt;p&gt;阅读时要区分：类、类的实例对象、类对象！
如何理解 ruby 中的元编程？yehuda 说搞定一个 self 就 ok 了，我看了，还是有点晕晕乎乎，结合学习 ruby 元编程的那本书，我觉得，关键是搞懂 def 这个关键字。
def 的定义有两种情况（方法的前面有没有前缀：接收者）：
一 def method_name
二 def x.method_name&lt;/p&gt;

&lt;p&gt;第一种情况，
def method_name
    p "ok"
end
会在当前类（用 CurrentClass 表示当前类）中定义一个实例方法（所谓类的实例方法，虽然是定义在存放在类中，但类自己不能调用，只能 new 一个实例才能调用）即：
CurrentClass.method_name        #=&amp;gt; undefined
CurrentClass.new.method_name #=&amp;gt; ok&lt;/p&gt;

&lt;p&gt;第二种情况，
def x.method_name
end
会定义一个单件方法，即属于 x 的单件方法，x 是什么，x 就是对象，在这里不管是 myob、MyClass、self 还是什么其他的什么对象，可以是一般对象，也可以是类对象，总之是一个对象。我们知道方法只能放在类中，所以这个单件方法会放在 x 的单件类（大家都知道这个单件类藏起来了）中。&lt;/p&gt;

&lt;p&gt;class Myclass
    def method1
        p "method1"
    end
    def self.method2
        p "method2"
    end&lt;/p&gt;

&lt;p&gt;def Myclass.method3
         p "method3"
    end
    class&amp;lt;&amp;lt;Myclass
           def method4
                p "method4"
           end
    end
    class&amp;lt;&amp;lt;self
           def method5
                p "method5"
           end
    end
end&lt;/p&gt;

&lt;p&gt;上面这几个方法定义中，method1,method2 和 method3 无需解释，method4 和 method5 要琢磨一下，这两个方法属于第一种情况，没有前缀，是一个普通的实例方法，关键是看当前类是什么，还是 Myclass 吗？&lt;/p&gt;

&lt;p&gt;class&amp;lt;&amp;lt;X
   我这个位置很特殊
end
就是进入 X 的单件类的作用域中，“我这个位置很特殊”这里的当前类就是 X 的单件类。补充一句，X 是个对象。
而上述定义 method4 和 method5 的地方正好是位于 Myclass 类对象的单件类之内，而不是 Myclass 类对象本身，所以 method4 和 method5 也就很好理解了，这两个方法的接受者是类（Myclass 类对象的单件类）的实例对象（也就是 Myclass 类对象），
所以这里定义的两个方法恰好是 MyClass 的类方法。&lt;/p&gt;

&lt;p&gt;实在是拗口，不知道我有没有说清楚。
总结一句话的话，要看 def 前面有没有内容，如果没有，就是纯真的方法定义，要看当前类是什么，最终就是是这个当前类的实例方法；如果有前缀 x.，方法就定义在 x 的单件类中。&lt;/p&gt;

&lt;p&gt;再来看两种情况，
MyClass.class_eval do
    def method6
        p "method6"
    end
end&lt;/p&gt;

&lt;p&gt;MyClass.instance_eval do
    def method7
        p "method7"
    end
end&lt;/p&gt;

&lt;p&gt;注意，上述两种情况都属于没有前缀的，所以会纠结在当前类什么这个问题上。
class_eval 会修改当前类，在这里，当前类就是 Myclass，所以 method 的存放位置就在 Myclass 中，这个方法就一个实例方法。
instance_eval 呢？我们知道这个方法会修改当前对象（即 self），但是会修改当前类吗，答案是会！在 MyClass.instance_eval 中，
当前类是 MyClass 的单件类，所以呢，这个方法是一个类方法。&lt;/p&gt;

&lt;p&gt;参考文献：
&lt;a href="http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/" rel="nofollow" target="_blank"&gt;http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/&lt;/a&gt;
另加：
&lt;a href="http://yugui.jp/articles/846" rel="nofollow" target="_blank"&gt;http://yugui.jp/articles/846&lt;/a&gt;（这篇和我说的意思比较接近）&lt;/p&gt;

&lt;p&gt;补充一点：许多情况下，当前类和当前对象（即 self）是一致的，但也有时候也会有差别：
例如：
class MyClass
  def method1
  end
  def self.method2
  end
end
在这里，当前类和当前对象是一致的，即都是 MyClass，定义方法时声明接收者的话，方法就会定义在当前对象的单件类中，不声明接收者的话，方法就会定义在当前类中。&lt;/p&gt;

&lt;p&gt;但在 X.instance_eval 中，当前对象和当前类是不一样的，当前对象是 X，而当前类则是 X 的单件类，从而导致：
class MyClass
end
MyClass.instance_eval do
  def method1
  end
  def self.method2
  end
end
中，method1 和 method 都是 MyClass 的类方法。。&lt;/p&gt;</description>
      <author>xwf286</author>
      <pubDate>Thu, 25 Jul 2013 13:06:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/12760</link>
      <guid>https://ruby-china.org/topics/12760</guid>
    </item>
    <item>
      <title>ruby-china 代码研究</title>
      <description>&lt;p&gt;内容比较丑陋，算是个抛砖引玉吧，如果不是新手，就走开吧。
最近发现 rc 的源代码的资料比较高，网上搜了一遍，也没有发现类似面向新手的分析性文章。&lt;/p&gt;

&lt;p&gt;redis 使用
计数器&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;topicController&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;
    &lt;span class="vi"&gt;@topic.hits.incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;Topic&lt;/span&gt;
    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Objects&lt;/span&gt;
    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="ss"&gt;:hits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;消息系统：
采用 faye：
参考资料：
&lt;a href="http://railscasts.com/episodes/260-messaging-with-faye?view=asciicast" rel="nofollow" target="_blank"&gt;http://railscasts.com/episodes/260-messaging-with-faye?view=asciicast&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;当用户 A 回复用户 B 的评论时，rc 会使用消息系统将该回复通知到用户 B：
1 当 create 一个新的 Reply 时，会调用 Reply 的回调方法：after_create&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;Reply&lt;/span&gt;
  &lt;span class="n"&gt;after_create&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_topic_reply_notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&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;2 创建 Notification::TopicReply&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;send_topic_reply_notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reply_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reply_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;
    &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topic&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;
    &lt;span class="c1"&gt;# 给发帖人发回帖通知&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mentioned_user_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="no"&gt;Notification&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TopicReply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt; &lt;span class="ss"&gt;:user_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:reply_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;
      &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notified_user_ids&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c1"&gt;# 给关注者发通知&lt;/span&gt;
    &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;follower_ids&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;uid&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="c1"&gt;# 排除同一个回复过程中已经提醒过的人&lt;/span&gt;
      &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notified_user_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="c1"&gt;# 排除回帖人&lt;/span&gt;
      &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt;
      &lt;span class="no"&gt;Notification&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TopicReply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt; &lt;span class="ss"&gt;:user_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:reply_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3 Notification::TopicReply 的基类是 Notification::Base&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;Notification::TopicReply&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Notification&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;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:reply&lt;/span&gt;

  &lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="ss"&gt;:body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:to&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:prefix&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;:allow_nil&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify_hash&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="ss"&gt;:title&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"关注的话题有了新回复:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="ss"&gt;:content&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply_body&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="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="ss"&gt;:content_path&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content_path&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;content_path&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;
    &lt;span class="n"&gt;url_helpers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topic_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topic_id&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;4Notification::Base 的 create 方法有个回调：realtime_push_to_client，在该回调里会将通知广播出去
Notification::Base&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;after_create&lt;/span&gt; &lt;span class="ss"&gt;:realtime_push_to_client&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;realtime_push_to_client&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;
      &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify_hash&lt;/span&gt;
      &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:count&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;
      &lt;span class="no"&gt;FayeClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/notifications_count/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;temp_access_token&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="nb"&gt;hash&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;class&lt;/span&gt; &lt;span class="nc"&gt;FayeClient&lt;/span&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;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;Thread&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="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:token&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Setting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;faye_token&lt;/span&gt;
      &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:channel&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Setting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;faye_server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:message&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;)&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;5 客户端接受到上面的通知后：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;initNotificationSubscribe&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="n"&gt;faye&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="no"&gt;Faye&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;FAYE_SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;notification_subscription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faye&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt; &lt;span class="s2"&gt;"/notifications_count/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;CURRENT_USER_ACCESS_TOKEN&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="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"#user_notifications_count span"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;new_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\(\d+\) /&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
      &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"badge-error"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;new_title&lt;/span&gt; &lt;span class="o"&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;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&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;new_title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
      &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fixUrlDash&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="no"&gt;ROOT_URL&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content_path&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="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
      &lt;span class="vg"&gt;$.&lt;/span&gt;&lt;span class="n"&gt;notifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"badge-error"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kp"&gt;true&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>xwf286</author>
      <pubDate>Tue, 21 May 2013 10:25:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/11124</link>
      <guid>https://ruby-china.org/topics/11124</guid>
    </item>
  </channel>
</rss>
