<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>algo31031 (韩冰)</title>
    <link>https://ruby-china.org/algo31031</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>求推荐一个能支持双向回拨的电话服务</title>
      <description>&lt;p&gt;需要能够支持拨打国外的电话；
能设定最长可通话时间，并且电话快结束时候可以有提示；
可自定义主叫被叫号码。&lt;/p&gt;

&lt;p&gt;目前采用的是&lt;a href="http://www.yuntongxun.com/ability/toReturnCall" rel="nofollow" target="_blank" title=""&gt;云通讯&lt;/a&gt;的服务，但是只能拨打国内电话，而且电话时间到了没有提示直接就断线了，想换一家，大家谁知道有谁的服务比较靠谱&lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Tue, 28 Oct 2014 13:21:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/22303</link>
      <guid>https://ruby-china.org/topics/22303</guid>
    </item>
    <item>
      <title>几个鲜为人知的 ActiveRecord Associations 小技巧 (译)</title>
      <description>&lt;p&gt;原文出自&lt;a href="http://www.gotealeaf.com/blog/ruby-on-rails-activerecord-association-features/" rel="nofollow" target="_blank" title=""&gt;gotealeaf.com&lt;/a&gt;, 感谢作者 Steve Turczyn&lt;/p&gt;

&lt;p&gt;作为一个 Rails 开发者，与 ActiveRecord associations 打交道实属家常便饭。但其中若干特性，却非尽人皆知。&lt;/p&gt;
&lt;h3 id="自定义查询"&gt;自定义查询&lt;/h3&gt;
&lt;p&gt;假如你在开发一个允许发表评论的博客，保不齐会遇到各种不和谐的言论充斥于评论间 (这里毕竟是互联网). 为了保证只显示经核准的评论，你要在 comments 表里加一个&lt;code&gt;boolean&lt;/code&gt;型字段：&lt;code&gt;approved&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;对于每篇博客，由于只想取出审核过的评论 (即那些被管理员标记为通过的), 所以需要自定义查询。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/models/post.rb&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&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;has_many&lt;/span&gt; &lt;span class="ss"&gt;:approved_comments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt; &lt;span class="ss"&gt;approved: &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;class_name: &lt;/span&gt;&lt;span class="s1"&gt;'Comment'&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，当你需要取出某篇博客里审核过的评论时，只需要使用&lt;code&gt;my_post.approved_comments&lt;/code&gt;.  &lt;/p&gt;
&lt;h3 id="扩展"&gt;扩展&lt;/h3&gt;
&lt;p&gt;有可能你还是需要有个选项能调出一篇博客的全部评论，或者只看在今天发的那些。这时你可以利用扩展功能，在某个特定的关系上追加一个自定义方法。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/models/post.rb&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&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;has_many&lt;/span&gt; &lt;span class="ss"&gt;:comments&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;today&lt;/span&gt;
      &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"created_at &amp;gt;= ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beginning_of_day&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="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样一来，除了原本的&lt;code&gt;my_post.comments&lt;/code&gt;, 你还能通过诸如&lt;code&gt;my_post.comments.today&lt;/code&gt;这种调用让检索更确切。 &lt;/p&gt;
&lt;h3 id="回调"&gt;回调&lt;/h3&gt;
&lt;p&gt;在记录被添加或移除之前与之后，自动的调用方法，这个可以有。&lt;/p&gt;

&lt;p&gt;假如你有一个建筑项目 (BuildingProject), 里面有许多工人 (Worker). 每次增加一个工人，都需要重新计算项目预算和完工日期的变化，而这些有又可能与工人类型工作经验等等息息相关...好个麻烦的方法，要能在添加完工人后自动调用就好了。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/models/building_project.rb&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BuildingProject&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;has_many&lt;/span&gt; &lt;span class="ss"&gt;:workers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;after_add: :recalculate_project_status&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recalculate_project_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newly_added_worker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原文出自&lt;a href="http://www.gotealeaf.com/blog/ruby-on-rails-activerecord-association-features/" rel="nofollow" target="_blank" title=""&gt;gotealeaf.com&lt;/a&gt;, 感谢作者 Steve Turczyn&lt;/p&gt;
&lt;h3 id="inverse_of"&gt;inverse_of&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;inverse_of&lt;/code&gt;可以很方便的使相互关联的对象从任意方向被访问到。&lt;code&gt;my_post.comments&lt;/code&gt;和&lt;code&gt;my_comment.post&lt;/code&gt;. 当然，在&lt;code&gt;Post&lt;/code&gt;里指定&lt;code&gt;has_many :comments&lt;/code&gt;并且在&lt;code&gt;Comment&lt;/code&gt;里指定&lt;code&gt;belongs_to :post&lt;/code&gt;之后，便已经可以得到上述 2 个关系。但是加上&lt;code&gt;inverse_of&lt;/code&gt;之后，会让 rails 确保关系里的对象乃是相同的对象。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;inverse_of&lt;/code&gt;指定方法如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/models/post.rb&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&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;has_many&lt;/span&gt; &lt;span class="ss"&gt;:comments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;inverse_of: &lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;
 &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在先去掉&lt;code&gt;inverse_of&lt;/code&gt;, 如果你这样这样这样...&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:importance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;working_post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;
&lt;span class="n"&gt;working_post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:importance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importance?&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;喔！系统咋还是觉得你的 blog 不给力...这是因为&lt;code&gt;comment.post&lt;/code&gt;执行了一次单独的 DB 查询，得到的对象虽然对应 DB 里同一条 Post 记录，但却是不同的实例。而原本那条 post 记录的对象还是不知道自己在 DB 的状态已经被改变了。&lt;/p&gt;

&lt;p&gt;那么让我们把&lt;code&gt;inverse_of&lt;/code&gt;加回去，重新执行刚才的代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:importance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;working_post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;
&lt;span class="n"&gt;working_post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:importance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importance?&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好多了！加上&lt;code&gt;inverse_of&lt;/code&gt;之后，&lt;code&gt;comment.post&lt;/code&gt;不再做 DB 查询，而是直接使用已被加到内存里的 post 对象的实例。换言之，这时的&lt;code&gt;working_post&lt;/code&gt;就是上面的&lt;code&gt;post&lt;/code&gt;, 所以对&lt;code&gt;working_post&lt;/code&gt;的改变会直接反应在&lt;code&gt;post&lt;/code&gt;上。&lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Fri, 04 Jul 2014 12:02:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/20311</link>
      <guid>https://ruby-china.org/topics/20311</guid>
    </item>
    <item>
      <title>rails2.3 vendor/plugins/ 下的 gem 该如何加载到 rack application 里面?</title>
      <description>&lt;p&gt;前段时间用 faye 为系统添加了即时聊天的功能，faye server 被打包进 rack application, 通过&lt;code&gt;/config/initializers/faye.rb&lt;/code&gt;, 使用 thin 随 rails 一同启动。&lt;/p&gt;

&lt;p&gt;之后客户追加新功能，需要对未在线用户，如果有新的聊天信息，要对其进行提醒&lt;/p&gt;

&lt;p&gt;因为要兼顾 IE 用户，未使用 faye websocket. 所以判断用户是否在线采取的策略是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在 rack 程序里添加 faye server 端扩展，遇到 subscribe event 则把对应 user 设为在线状态，同时记录下使用的 clientId&lt;/li&gt;
&lt;li&gt;监听 unsubscribe 和 disconnect 事件，通过 clientId 找到该 user, 将其标记为离线&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;标记在线/离线时候，使用到了 ActiveRecord 的 model, 而 model 里又用到了位于 vendor/plugins/下的 gem, acts_as_paranoid.
于是在 rack 里面一顿 require, 总算是在本地能跑起来 (development 下的 thin/webrick, production 下 apache+passenger)
但是部署到服务器之后，发现 thin 启动不起来，报错说找不到&lt;code&gt;destroy_without_callbacks&lt;/code&gt;方法&lt;/p&gt;

&lt;p&gt;又折腾了好半天没什么结果，恳请大家帮我看下是哪儿出了问题，非常感谢。&lt;/p&gt;

&lt;p&gt;thin 启动失败的报错信息&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/college-dev/rails/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb:56:in `alias_method': undefined method `destroy_without_callbacks' for class `UserChatTeam' (NameError)
    from /home/college-dev/rails/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb:56:in `acts_as_paranoid'
    from /home/college-dev/rails/app/models/user_chat_team.rb:2
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.3/lib/active_support/dependencies.rb:240:in `require'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.3/lib/active_support/dependencies.rb:223:in `load_dependency'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.3/lib/active_support/dependencies.rb:640:in `new_constants_in'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.3/lib/active_support/dependencies.rb:223:in `load_dependency'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.3/lib/active_support/dependencies.rb:240:in `require'
    from faye.ru:14
    from /usr/lib/ruby/gems/1.8/gems/rack-1.3.6/lib/rack/builder.rb:51:in `instance_eval'
    from /usr/lib/ruby/gems/1.8/gems/rack-1.3.6/lib/rack/builder.rb:51:in `initialize'
    from faye.ru:1:in `new'
    from faye.ru:1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;faye.ru 的内容&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;'faye'&lt;/span&gt;
&lt;span class="nb"&gt;require&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;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../config/initializers/faye_token.rb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'active_record'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mysql'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'yaml'&lt;/span&gt;

&lt;span class="c1"&gt;# using 'acts_as_paranoid' as a plugin in 'vendor/plugins'&lt;/span&gt;
&lt;span class="no"&gt;RAILS_ENV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'RACK_ENV'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;span class="nb"&gt;load&lt;/span&gt; &lt;span class="s1"&gt;'active_record/associations.rb'&lt;/span&gt; 
&lt;span class="nb"&gt;require&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;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&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;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../vendor/plugins/acts_as_paranoid/lib/caboose/acts/belongs_to_with_deleted_association.rb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&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;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../vendor/plugins/acts_as_paranoid/lib/caboose/acts/has_many_through_without_deleted_association.rb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&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;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../vendor/plugins/acts_as_paranoid/init.rb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&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;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../app/models/user_chat_team.rb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'RACK_ENV'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt;
&lt;span class="n"&gt;dbconfig&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&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;read&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="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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dbconfig&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ServerAuth&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;incoming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&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;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'channel'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!~&lt;/span&gt; &lt;span class="sr"&gt;%r{^/meta/}&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ext'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'auth_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;FAYE_TOKEN&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Invalid authentication token.'&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ext'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth_token'&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="n"&gt;callback&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="n"&gt;message&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;MarkOnline&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;incoming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&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;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'channel'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'/meta/subscribe'&lt;/span&gt;
      &lt;span class="no"&gt;UserChatTeam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark_online&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                                &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'chat_team_id'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'clientId'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; 
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;callback&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="n"&gt;message&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="n"&gt;faye_server&lt;/span&gt; &lt;span class="o"&gt;=&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;RackAdapter&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="ss"&gt;:mount&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'/faye'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:timeout&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;faye_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_extension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ServerAuth&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;faye_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_extension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;MarkOnline&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;faye_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unsubscribe'&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;client_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="no"&gt;UserChatTeam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark_offline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;faye_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'disconnect'&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;client_id&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="no"&gt;UserChatTeam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark_offline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;faye_server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;faye.rb 的内容&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 随rails一起启动faye server&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="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"thin -C &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/config/faye.ym l start"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'yaml'&lt;/span&gt;

&lt;span class="c1"&gt;# もしキーが存在しなかったら例外を投げる様にする。&lt;/span&gt;
&lt;span class="no"&gt;FAYE_CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Hash&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="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"no such key : [&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;key&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="no"&gt;FAYE_CONFIG&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&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_ROOT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'/config/faye.yml'&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="no"&gt;FAYE_CONFIG&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;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&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;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;v&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="no"&gt;Hash&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="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"no such a key in FAYE_CONFIG : &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;key&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;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&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="c1"&gt;# FAYE_CONFIGのキーが全てSymbolで指定してあるかチェック&lt;/span&gt;
&lt;span class="c1"&gt;# Symbol以外の値は不正なので、例外を出して起動を中止する。&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;faye_config_valid?&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="nb"&gt;hash&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;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="c1"&gt;# Railsの仕様で、environment.rb で例外を出しても起動してしまうが、&lt;/span&gt;
      &lt;span class="c1"&gt;# gem の読み込みエラーのみ停止してくれるので、仕方なくそれを利用する。&lt;/span&gt;
      &lt;span class="c1"&gt;# 詳細は config/boot.rb を参照のこと。&lt;/span&gt;
      &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'/config/faye.yml のキーは全てシンボルでなければいけません。'&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; 
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Hashならば、再帰処理&lt;/span&gt;
      &lt;span class="n"&gt;faye_config_valid?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Stringならば、{RAILS_ROOT}を実際の値に書き換える.&lt;/span&gt;
      &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\{RAILS_ROOT\}/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;RAILS_ROOT&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;end&lt;/span&gt;
&lt;span class="n"&gt;faye_config_valid?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;FAYE_CONFIG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Don't Comment out!!&lt;/span&gt;
&lt;span class="no"&gt;FAYE_CONFIG&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;freeze&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>algo31031</author>
      <pubDate>Mon, 30 Jun 2014 14:41:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/20237</link>
      <guid>https://ruby-china.org/topics/20237</guid>
    </item>
    <item>
      <title>可能火星了，但是 Ubuntu One 到 6 月 1 号就关闭了？？？</title>
      <description>&lt;p&gt;我可能过于后知后觉了，但是的确才知道这嘛事儿。。。
&lt;a href="http://blog.canonical.com/2014/04/02/shutting-down-ubuntu-one-file-services/" rel="nofollow" target="_blank" title=""&gt;Shutting down Ubuntu One file services&lt;/a&gt;
需要物色别的网盘了&lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Sat, 17 May 2014 21:51:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/19333</link>
      <guid>https://ruby-china.org/topics/19333</guid>
    </item>
    <item>
      <title>帖子的预览和实际发完之后, 样式有点出入</title>
      <description>&lt;h3 id="预览的"&gt;预览的&lt;/h3&gt;
&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/d63f2098c315cac34ac1be21f0fa2a98.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="帖子的"&gt;帖子的&lt;/h3&gt;
&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/886641bd85f056cf4de79c042b4d78c5.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Thu, 15 May 2014 09:39:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/19264</link>
      <guid>https://ruby-china.org/topics/19264</guid>
    </item>
    <item>
      <title>Ruby 下的 ===, ==, eql?, equal?</title>
      <description>&lt;h3 id="=== case equality"&gt;=== case equality&lt;/h3&gt;
&lt;p&gt;严格说来，这个其实跟另外三个不属于一类。 &lt;/p&gt;

&lt;p&gt;&lt;code&gt;a === b&lt;/code&gt; 相当于 "如果我有一个贴了 a 标签的抽屉，那么把 b 放到这个抽屉里是否可行？"&lt;/p&gt;

&lt;p&gt;作为 case equality operator, 其首要作用自然是在&lt;code&gt;when/case&lt;/code&gt;里，作为判断进入某个分支的依据&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt;
  &lt;span class="s2"&gt;"case Integer"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
  &lt;span class="s2"&gt;"case 5"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码其实是会返回&lt;code&gt;"case Integer"&lt;/code&gt;的，因为&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2.1.1 :043 &amp;gt; Integer === 5
 =&amp;gt; true 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;相应的&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2.1.1 :054 &amp;gt; (1..5) === 5
 =&amp;gt; true 
2.1.1 :055 &amp;gt; (1...5) === 5
 =&amp;gt; false 
2.1.1 :058 &amp;gt; /(a|e|i|o|u)/ === "hello"
 =&amp;gt; true  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于&lt;code&gt;Object#===&lt;/code&gt;, 事实上等价于&lt;code&gt;Object#==&lt;/code&gt;.&lt;br&gt;
但是对 Object 的子类，&lt;code&gt;===&lt;/code&gt;一般会被重写，使其在条件表达式里有意义。&lt;/p&gt;
&lt;h3 id="=="&gt;==&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;==&lt;/code&gt;是最为常用的用于比较两个对象值是否相等的方法&lt;/p&gt;

&lt;p&gt;&lt;code&gt;a == b&lt;/code&gt;相当于判断"a 的值与 b 的值相同吗"&lt;/p&gt;

&lt;p&gt;&lt;code&gt;==&lt;/code&gt;方法经常被 Object 子类重写以满足其自身需求&lt;/p&gt;
&lt;h3 id="equal?"&gt;equal?&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;equal?&lt;/code&gt;方法用来判断 2 个对象是否是同一个对象&lt;/p&gt;

&lt;p&gt;&lt;code&gt;a.equal? b&lt;/code&gt;相当于判断"a 就是 b 吗"&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2.1.1 :005 &amp;gt; "a" == "a"
 =&amp;gt; true 
2.1.1 :006 &amp;gt; "a".equal? "a"
 =&amp;gt; false 
2.1.1 :007 &amp;gt; :a.equal? :a
 =&amp;gt; true 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与&lt;code&gt;==&lt;/code&gt;不同，&lt;code&gt;equal?&lt;/code&gt;不应该被子类重写&lt;/p&gt;
&lt;h3 id="eql?"&gt;eql?&lt;/h3&gt;
&lt;p&gt;与&lt;code&gt;==&lt;/code&gt;类似，但是可以看做是更严格的&lt;code&gt;==&lt;/code&gt;&lt;br&gt;
在&lt;code&gt;Object&lt;/code&gt;里，&lt;code&gt;==&lt;/code&gt;与&lt;code&gt;eql?&lt;/code&gt;是同意，但是很多子类会重写&lt;code&gt;eql?&lt;/code&gt;以提供更严格的比较，比如：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2.1.1 :010 &amp;gt; 1 == 1
 =&amp;gt; true 
2.1.1 :011 &amp;gt; 1 == 1.0
 =&amp;gt; true 
2.1.1 :012 &amp;gt; 1.eql? 1.0
 =&amp;gt; false 
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>algo31031</author>
      <pubDate>Wed, 14 May 2014 17:27:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/19252</link>
      <guid>https://ruby-china.org/topics/19252</guid>
    </item>
    <item>
      <title>使用 vagrant 和 knife-solo 在 AWS 上搭建开发环境</title>
      <description>&lt;p&gt;前段日子客户要求帮忙调查下他们的程序该如何发布 (好吧，对这事我也很无语...), 
借机简单研究了下 vagrant 和 chef, 整理了两篇流水账如下&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.banban.me/blog/2014/04/12/shi-yong-vagranthe-knife-solozai-ubuntu-13-dot-10xia-da-jian-ce-shi-huan-jing/" rel="nofollow" target="_blank" title=""&gt;(一) 使用 vagrant 和 knife-solo 配合 Vitrualbox 搭建本地测试环境&lt;/a&gt;
&lt;a href="http://blog.banban.me/blog/2014/04/13/tong-guo-vagranthe-knife-soloda-jian-aws-ec2kai-fa-huan-jing/" rel="nofollow" target="_blank" title=""&gt;(二) 通过 vagrant 和 knife-solo 搭建 AWS_EC2 开发环境&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;顺便吐槽下 AWS 的新用户体验账号几乎什么也没做呢就被扣了 10 刀的坑...
一个是 EC2 下如果申请了 Elastic IP, 一定要与 &lt;strong&gt;运行中&lt;/strong&gt; 的 EC2 实例关联上，如果实例关机了或者没关联实例，都是要论小时收钱的
再一个就是 t1.micro 实例慎用 swap 分区，不然短时间内会对 EBS 造成海量的 IOs(一周多时间，几乎没做什么，超过 6 千万 IOs...),  而 free tier 每月只有前 2 百万 IOs 是免费的&lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Fri, 18 Apr 2014 15:49:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/18690</link>
      <guid>https://ruby-china.org/topics/18690</guid>
    </item>
    <item>
      <title>Ruby 里的 %Q, %q, %W, %w, %x, %r, %s, %i (译)</title>
      <description>&lt;p&gt;&lt;a href="http://simpleror.wordpress.com/2009/03/15/q-q-w-w-x-r-s/" rel="nofollow" target="_blank" title=""&gt;原文地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="%Q"&gt;%Q&lt;/h2&gt;
&lt;p&gt;用于替代双引号的字符串。当你需要在字符串里放入很多引号时候，可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\")&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%Q(Joe said: "Frank said: "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;what_frank_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;"")&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Joe said: "&lt;/span&gt;&lt;span class="no"&gt;Frank&lt;/span&gt; &lt;span class="ss"&gt;said: &lt;/span&gt;&lt;span class="s2"&gt;"Hello!"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;(&lt;/code&gt;...&lt;code&gt;)&lt;/code&gt;也可用其他非数字字母的符号或成对的符号代替，诸如&lt;code&gt;[&lt;/code&gt;...&lt;code&gt;]&lt;/code&gt;, &lt;code&gt;!&lt;/code&gt;...&lt;code&gt;!&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;...&lt;code&gt;+&lt;/code&gt;,&lt;code&gt;{&lt;/code&gt;...&lt;code&gt;}&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;...&lt;code&gt;&amp;gt;&lt;/code&gt;等。&lt;br&gt;
以下写法全部与上面等效：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%Q!Joe said: "Frank said: "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;what_frank_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;""!&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%Q[Joe said: "Frank said: "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;what_frank_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;""]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%Q+Joe said: "Frank said: "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;what_frank_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;""+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;除此之外还可省略&lt;code&gt;Q&lt;/code&gt;写作：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%/Joe said: "Frank said: "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;what_frank_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;""/&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Joe said: "&lt;/span&gt;&lt;span class="no"&gt;Frank&lt;/span&gt; &lt;span class="ss"&gt;said: &lt;/span&gt;&lt;span class="s2"&gt;"Hello!"""&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%q"&gt;%q&lt;/h2&gt;
&lt;p&gt;与&lt;code&gt;%Q&lt;/code&gt;类似，但是表示的是单引号字符串&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%q(Joe said: 'Frank said: '#{what_frank_said} ' ')&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Joe said: 'Frank said: '&lt;/span&gt;&lt;span class="se"&gt;\#&lt;/span&gt;&lt;span class="s2"&gt;{what_frank_said} ' '"&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%W"&gt;%W&lt;/h2&gt;
&lt;p&gt;语法近似于&lt;code&gt;%Q&lt;/code&gt;, 用于表示其中元素被双引号括起的数组。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%W(&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt; Bar Bar&lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="sx"&gt;with&lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="sx"&gt;space)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Bar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Bar with space"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%w"&gt;%w&lt;/h2&gt;
&lt;p&gt;用于表示其中元素被单引号括起的数组。比较奇怪的是&lt;code&gt;\&lt;/code&gt;(斜杠空格) 会被转化成&lt;code&gt;&lt;/code&gt;(空格), 但是其他的内容不会。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%w(a b c\ d &lt;/span&gt;&lt;span class="se"&gt;\#&lt;/span&gt;&lt;span class="sx"&gt;e #{1}f)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"c d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;#e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\#&lt;/span&gt;&lt;span class="s2"&gt;{1}f"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%x"&gt;%x&lt;/h2&gt;
&lt;p&gt;使用`方法执行一段 shell 脚本并返回标准输出内容。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%x(echo foo:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"foo:Foo&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%r"&gt;%r&lt;/h2&gt;
&lt;p&gt;语法近似于&lt;code&gt;%Q&lt;/code&gt;, 用于正则表达式。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sr"&gt;%r(/home/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;)&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"/&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;/home&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;/Foo/"&lt;/span&gt;     
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%s"&gt;%s&lt;/h2&gt;
&lt;p&gt;用于表示 symbol, 但是不会对其中表达式等内容进行转化&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%s(foo)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:foo&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%s(foo bar)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:"foo bar"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%s(#{foo} bar)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:"&lt;/span&gt;&lt;span class="se"&gt;\#&lt;/span&gt;&lt;span class="ss"&gt;{foo} bar"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="%i"&gt;%i&lt;/h2&gt;
&lt;p&gt;Ruby 2.0 之后引入的语法，用于生成一个 symbol 数组&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mf"&gt;2.0&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;p247&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;014&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%i(a b c)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>algo31031</author>
      <pubDate>Thu, 10 Apr 2014 10:58:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/18512</link>
      <guid>https://ruby-china.org/topics/18512</guid>
    </item>
    <item>
      <title>刚申请的ＡＷＳ免费账户被收了 0.12 刀...</title>
      <description>&lt;p&gt;$0.005 per Elastic IP address not attached to a running instance per hour (prorated)    &lt;/p&gt;

&lt;p&gt;原来还有这种收费项目．．．&lt;/p&gt;

&lt;p&gt;简而言之就是申请了EIP但是没与&lt;strong&gt;运行中&lt;/strong&gt;的实例相关联，还好及时发现．&lt;br&gt;
刚去研究了下文档，&lt;a href="http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#concepts-elastic-addressing" rel="nofollow" target="_blank" title=""&gt;还真有说&lt;/a&gt;  &lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Sat, 22 Mar 2014 22:30:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/18099</link>
      <guid>https://ruby-china.org/topics/18099</guid>
    </item>
    <item>
      <title>尝试 delayed_job 使用独立数据库之后，script/delayed_job start 无反应，并且报错提示找不到对象</title>
      <description>&lt;p&gt;项目需要把 delayed_job 数据库独立出来，创建完新数据库之后，运行&lt;code&gt;RAILS_ENV=production script/delayed_job start&lt;/code&gt;无反应，新的 DJ 数据库里能加进去数据，&lt;code&gt;RAILS_ENV=production rake jobs:work&lt;/code&gt;能运行，但是会报错说找不到对象，卡了一晚上，谁能帮我看下是哪里写的不对，不胜感激，具体代码如下：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;config/initializers/delayed_job_config.rb&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Delayed&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;establish_connection&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configurations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"delayed_job"&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;&lt;strong&gt;&lt;code&gt;database.yml&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;delayed_job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql2&lt;/span&gt;
  &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;utf8&lt;/span&gt;
  &lt;span class="na"&gt;reconnect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;delayed_job&lt;/span&gt;
  &lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;987654"&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;my_job.rb&lt;/code&gt;&lt;/strong&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;MyJob&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Struct&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="ss"&gt;:episode&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;perform&lt;/span&gt; 
    &lt;span class="n"&gt;episode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;do_something&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;strong&gt;DJ 的报错信息提示说找不到 episode&lt;/strong&gt;，&lt;code&gt;Couldn't find Episode with id=1&lt;/code&gt;&lt;/p&gt;</description>
      <author>algo31031</author>
      <pubDate>Sun, 23 Jun 2013 22:55:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/11928</link>
      <guid>https://ruby-china.org/topics/11928</guid>
    </item>
  </channel>
</rss>
