<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>iwinux</title>
    <link>https://ruby-china.org/iwinux</link>
    <description>野生程序员</description>
    <language>en-us</language>
    <item>
      <title>from Ruby to Go</title>
      <description>&lt;p&gt;最近很蛋疼地想试试用 Go 语言写 web app，写着写着就开始想念 Rails 的“无微不至”了：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;DB migration: Sorry，Go 里面没有这种工具，没有神奇的 &lt;code&gt;go generate migration&lt;/code&gt;，只好自己写了个 bash 脚本来管理，仿照 Rails 的做法，在数据库里建一个表 &lt;code&gt;schema_migrations&lt;/code&gt;，记录已运行的 migration 的版本号（目前只支持 PostgreSQL），暂时不支持 rollback……&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routing: 官方库 &lt;code&gt;net/http&lt;/code&gt; 的 &lt;code&gt;DefaultServeMux&lt;/code&gt; 只支持 static URL，还好有第三方的 &lt;a href="http://www.gorillatoolkit.org/pkg/mux" rel="nofollow" target="_blank" title=""&gt;gorilla/mux&lt;/a&gt;，这个库支持 URL 的正则匹配、方法过滤、子域等等，比较接近 Rails 的风格&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ORM: 貌似有一些现成的 ORM 库，但是我想试试手写 SQL——前天翻 PostgreSQL 文档并自己试验才弄明白了 SQL 注入的防护方法，算是额外的收获，而这些在 Rails 里面几乎没有接触过（人家都帮你做好了）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;前端：Go 写后端服务可以很拉风，但处理前端问题的时候还是要 Ruby 来救场——大家有没有注意过，sass / haml / coffeescript 这些全是 Ruby 写的东西，被迫在项目里加了个 Gemfile，haml 和 coffeescript 可以跳过，但 sass 已经离不开了。顺便试用了下 jammit 这个工具，可以模拟出 asset pipeline 的效果。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;现在我写代码时总是想着“Rails 是如何如何做的”，中毒太深了……&lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Thu, 25 Oct 2012 13:54:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/6312</link>
      <guid>https://ruby-china.org/topics/6312</guid>
    </item>
    <item>
      <title>Ruby 有没有官方 Language Reference？</title>
      <description>&lt;p&gt;经常想查一下某个语言特性的细节，却找不到在线文档，虽然说有 The Ruby Programming Language 这本纸质书可以作为参考资料，但是很不方便。&lt;/p&gt;

&lt;p&gt;（是说像 Python 的这种：&lt;a href="http://docs.python.org/reference/index.html" rel="nofollow" target="_blank"&gt;http://docs.python.org/reference/index.html&lt;/a&gt; ）&lt;/p&gt;

&lt;p&gt;BTW：Ruby 社区有没有跟 PEP (Python Enhancement Proposals) 类似的文档？&lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Thu, 30 Aug 2012 11:56:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/5248</link>
      <guid>https://ruby-china.org/topics/5248</guid>
    </item>
    <item>
      <title>mass assignment 赋值顺序</title>
      <description>&lt;p&gt;如果我有一个 form:&lt;/p&gt;
&lt;pre class="highlight haml"&gt;&lt;code&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;form_for&lt;/span&gt; &lt;span class="vi"&gt;@user&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text_field&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;
  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text_field&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么在 controller 里执行 &lt;code&gt;@user = User.new(params[:user])&lt;/code&gt; 或 &lt;code&gt;@user.update_attributes(params[:user])&lt;/code&gt; 的时候，是不是可以保证 &lt;code&gt;email&lt;/code&gt; 的赋值顺序先于 &lt;code&gt;name&lt;/code&gt; 呢？&lt;/p&gt;

&lt;p&gt;没有在官方文档找到有关的说明，仅有的线索：&lt;a href="https://github.com/rails/rails/blob/32709ea41ed1ec2a89590e9bc6656c1ecd462d30/activerecord/lib/active_record/attribute_assignment.rb#L66" rel="nofollow" target="_blank" title=""&gt;ActiveRecord::AttributeAssignment::ClassMethods#assign_attributes&lt;/a&gt; 方法在处理传入的 Hash 时保留了 key 的顺序。&lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Thu, 09 Aug 2012 12:33:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/4829</link>
      <guid>https://ruby-china.org/topics/4829</guid>
    </item>
    <item>
      <title>validates_uniqueness_of 的必要性？</title>
      <description>&lt;p&gt;根据 &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of" rel="nofollow" target="_blank" title=""&gt;Rails 官方文档&lt;/a&gt; 所说，假如 table 中某个 field 建立了 unique key index，那么插入重复值（比如重复的 email）时就会抛 ActiveRecord::RecordNotUnique 异常。这个重复值的检查是在数据库级别进行的。&lt;/p&gt;

&lt;p&gt;与此同时，大家平时用的比较多的方法是 validates_uniqueness_of，其实现方式是在 model validation 阶段以 find by field 查询数据库中是否存在重复值。由于 validation 和最终写入存在时间差，在高并发的情况下这种 validation 很不可靠。（所以无论如何都必须捕捉 ActiveRecord::RecordNotUnique 异常？）&lt;/p&gt;

&lt;p&gt;我的问题：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;既然 validates_uniqueness_of 不可靠，为什么不省掉这一步，直接捕捉（可能会抛出的）ActiveRecord::RecordNotUnique 异常？&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在什么地方处理这个异常比较合适（controller 还是 model）？最好能统一处理所有 model 的 ActiveRecord::RecordNotUnique 异常。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>iwinux</author>
      <pubDate>Fri, 03 Aug 2012 14:59:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/4717</link>
      <guid>https://ruby-china.org/topics/4717</guid>
    </item>
    <item>
      <title>Github Flavored Markdown 的官方 gem</title>
      <description>&lt;p&gt;刚刚在 &lt;a href="https://github.com/github/gollum" rel="nofollow" target="_blank" title=""&gt;gollum&lt;/a&gt; 的 gemspec 里看到的，gem 的名字叫 &lt;code&gt;github-markdown&lt;/code&gt;，Github 上找不到源码，但是 rubygems.org 上可以看到&lt;a href="https://rubygems.org/gems/github-markdown/" rel="nofollow" target="_blank" title=""&gt;记录&lt;/a&gt;，是今年四月发布的，所以是偷偷放出来不让人知道么……&lt;/p&gt;

&lt;p&gt;安装之后可以在 gems 目录找到它的源码，居然不依赖 &lt;code&gt;redcarpet&lt;/code&gt;，而是直接用了 &lt;a href="https://github.com/tanoku/sundown/" rel="nofollow" target="_blank" title=""&gt;sundown&lt;/a&gt; 这个库。&lt;/p&gt;

&lt;p&gt;有空试试把 Octopress 的 markdown 库换成这个。  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Wed, 13 Jun 2012 21:14:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/3793</link>
      <guid>https://ruby-china.org/topics/3793</guid>
    </item>
    <item>
      <title>这是 CarrierWave 的 bug 还是又拍云的问题？</title>
      <description>&lt;ol&gt;
&lt;li&gt;本机，32 位 Arch Linux，Ruby 1.9.3-p0, Rails 3.1.4, CarrierWave 0.5.8，carrierwave-upyun 0.1.5&lt;/li&gt;
&lt;li&gt;服务器，64 位 Ubuntu 10.04，Ruby 环境同上&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="问题描述："&gt;问题描述：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;在本机执行 photo.image.cache_stored_file!，会将又拍云服务器上的图片文件取回到 &lt;code&gt;RAILS_ROOT/uploads/tmp/xxx/xxx.jpg&lt;/code&gt;，文件格式是 jpg&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在服务器上执行同一个命令，取回的文件居然是 gzip 格式的……&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;完全搞不懂，为什么会出现不一致的结果？难道是操作系统的问题？CarrierWave 的 bug？又拍云的 bug？  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Tue, 27 Mar 2012 01:21:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/2154</link>
      <guid>https://ruby-china.org/topics/2154</guid>
    </item>
    <item>
      <title>carrierwave-upyun 重建缩略图时出错</title>
      <description>&lt;h2 id="问题描述"&gt;问题描述&lt;/h2&gt;
&lt;p&gt;在 rails console (RAILS_ENV=production) 中调用 &lt;code&gt;photo.image.recreate_versions!&lt;/code&gt; 时报错，错误信息如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NoMethodError: undefined method `content_type' for #&amp;lt;CarrierWave::Storage::UpYun::File:0x00000005bc84c8&amp;gt;
        from carrierwave-0.5.8/lib/carrierwave/uploader/cache.rb:74:in `cache_stored_file!'
        from carrierwave-0.5.8/lib/carrierwave/uploader/versions.rb:179:in `recreate_versions!'

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问这是又拍云的问题，还是 carrierwave-upyun 的问题？据说使用 Mongoid 的 GridFS 也会有同样的情况，大家有没有遇到过呢？&lt;/p&gt;
&lt;h2 id="环境"&gt;环境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;rails 3.1 (ActiveRecord + pg)&lt;/li&gt;
&lt;li&gt;carrierwave 0.5.8&lt;/li&gt;
&lt;li&gt;carrierwave-upyun 0.1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="相关代码"&gt;相关代码&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Photo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;mount_uploader&lt;/span&gt; &lt;span class="ss"&gt;:image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PhotoUploader&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;PhotoUploader&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;CarrierWave&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Uploader&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;CarrierWave&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MiniMagick&lt;/span&gt;
  &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="ss"&gt;:upyun&lt;/span&gt;

  &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="ss"&gt;:thumb&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="ss"&gt;:resize_and_pad&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'#000'&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;version&lt;/span&gt; &lt;span class="ss"&gt;:thumb_wide&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="ss"&gt;:resize_and_pad&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'#000'&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;</description>
      <author>iwinux</author>
      <pubDate>Fri, 16 Mar 2012 13:27:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/1900</link>
      <guid>https://ruby-china.org/topics/1900</guid>
    </item>
    <item>
      <title>一个上线的应用需要监控哪些技术指标？</title>
      <description>&lt;p&gt;很多关于网站架构的文章都有提到监控的问题，但通常只是列出他们监控用的工具，比如 Pingdom, Munin, New Relic 等等，并没有说他们具体在监控什么，所以我的问题是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;监控是主要针对网站性能的吗？&lt;/li&gt;
&lt;li&gt;如果是，那是不是意味着网站上线初期没有太大负载的时候可以省掉不做？&lt;/li&gt;
&lt;li&gt;如果不是，那么还有哪些指标需要注意的？&lt;/li&gt;
&lt;li&gt;你们在生产环境是怎么做的呢？&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在这方面我完全没概念，还请各位大牛指教。 &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Thu, 08 Mar 2012 01:11:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/1687</link>
      <guid>https://ruby-china.org/topics/1687</guid>
    </item>
    <item>
      <title>最完整的 Ruby 网络异常列表？</title>
      <description>&lt;p&gt;一个网络连接（通常是 HTTP）从建立到返回的过程中有可能会出现很多种异常情况，比如 DNS 解析错误，比如服务器超时，比如 404……&lt;/p&gt;
&lt;h2 id="我的问题："&gt;我的问题：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 Ruby 中有哪些异常是跟网络连接有关的？我 Google 到&lt;a href="http://subakva.tumblr.com/post/99000513/ruby-network-error-list" rel="nofollow" target="_blank" title=""&gt;这篇文章&lt;/a&gt;，作者列出的是 &lt;code&gt;SocketError, Timeout::Error, ActiveResource::TimeoutError, Errno::ECONNREFUSED, Errno::EHOSTDOWN, Errno::EHOSTUNREACH&lt;/code&gt;，显然这并不是完整的列表……&lt;/li&gt;
&lt;li&gt;下面两种写法哪种更好？&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="捕获所有异常"&gt;捕获所有异常&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'net/http'&lt;/span&gt;

&lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&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;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://ruby-china.org'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;Exception&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="捕获每一个指定的异常（不完全的列表）"&gt;捕获每一个指定的异常（不完全的列表）&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'net/http'&lt;/span&gt;

&lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&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;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://ruby-china.org'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;SocketError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Errno&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ETIMEDOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Errno&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ECONNREFUSED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
       &lt;span class="no"&gt;Errno&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;EHOSTDOWN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Errno&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;EHOSTUNREACH&lt;/span&gt;

  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>iwinux</author>
      <pubDate>Mon, 05 Mar 2012 01:20:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/1611</link>
      <guid>https://ruby-china.org/topics/1611</guid>
    </item>
    <item>
      <title>使用 gsub! 时发现的一个 ActiveModel 的问题</title>
      <description>&lt;p&gt;直接上代码大家应该就明白了：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&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;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt; &lt;span class="c1"&gt;# 假设 p.content 的值是 "abc123"&lt;/span&gt;
&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gsub!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'123'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'456'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 'abc456'&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content_changed?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true # 没有出错&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reload&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 'abc123' # 但是也没有保存成功&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的理解：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;执行 &lt;code&gt;content = p.content&lt;/code&gt; 这一句之后，content 跟 p.content 指向的是同一块内存&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gsub!&lt;/code&gt; 修改的是原内存位置的内容（不一定要是 &lt;code&gt;gsub!&lt;/code&gt;，像 &lt;code&gt;upcase!&lt;/code&gt; 这些方法效果也一样）&lt;/li&gt;
&lt;li&gt;根据 &lt;a href="https://github.com/rails/rails/blob/af64ac4e5ce8406137d5520fa88e8f652ab703e9/activemodel/lib/active_model/dirty.rb#L80" rel="nofollow" target="_blank" title=""&gt;ActiveModel::Dirty 的注释&lt;/a&gt; 可知，这种 &lt;strong&gt;in-place&lt;/strong&gt; 的改动，ActiveModel 是无法追踪到的&lt;/li&gt;
&lt;li&gt;只有当 &lt;code&gt;p.content_changed?&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt; 时 &lt;code&gt;p.save&lt;/code&gt; 才会保存新的 &lt;code&gt;content&lt;/code&gt; 值。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;严格来说不能算是 bug，只是一般情况下比较难注意到这种问题 = =  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Sat, 03 Mar 2012 11:17:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/1577</link>
      <guid>https://ruby-china.org/topics/1577</guid>
    </item>
    <item>
      <title>Ruby 1.9 的新 Hash 语法</title>
      <description>&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby-1.9.3-p0 :001 &amp;gt; { a: 1, b: 2 }
 =&amp;gt; {:a=&amp;gt;1, :b=&amp;gt;2} 
ruby-1.9.3-p0 :002 &amp;gt; { 'a': 1, 'b': 2 }
SyntaxError: (irb):2: syntax error, unexpected ':', expecting tASSOC
{ 'a': 1, 'b': 2 }
      ^
    from /home/winus/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `&amp;lt;main&amp;gt;'
ruby-1.9.3-p0 :003 &amp;gt; { 'a' =&amp;gt; 1, 'b' =&amp;gt; 2 }
 =&amp;gt; {"a"=&amp;gt;1, "b"=&amp;gt;2} 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ruby 1.9 的新 Hash 语法只有当 key 是 Symbol 的时候才能用，感觉这样反而多了很多语法风格不统一的地方（有些地方必需用 String 做 key）……有人用么？  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Sun, 12 Feb 2012 08:38:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/1154</link>
      <guid>https://ruby-china.org/topics/1154</guid>
    </item>
    <item>
      <title>对于有很多 association 的 model 要怎么处理……</title>
      <description>&lt;p&gt;现在有个 model 有超过 10 个 has_many（之后还有更多……），密密麻麻的，看着都晕。这种问题有什么靠谱的解决方法么？  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Fri, 10 Feb 2012 11:40:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/1121</link>
      <guid>https://ruby-china.org/topics/1121</guid>
    </item>
    <item>
      <title>我的服务器配置脚本</title>
      <description>&lt;p&gt;将自己经常用到的服务器配置文件和操作整理成一个比较傻瓜的脚本，现在如果要在一台新的服务器上安装 Nginx + Ruby + MongoDB，只需在服务器上运行以下命令（假设以 root 用户登录）：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt-get update &amp;amp;&amp;amp; apt-get upgrade
apt-get install git-core
git clone http://github.com/iwinux/server-bootstrap
cd server-bootstrap

./bootstrap deps # 安装依赖的包
./bootstrap user winus # 创建用户 winus （同时也会复制 git, screen, bash 等配置文件到 HOME 目录）
./bootstrap nginx # 从源码编译安装 Nginx 到 /opt/nginx，并设置自动启动
./bootstrap ruby winus # 安装 RVM 到用户 winus 的 HOME 目录，然后安装 Ruby 1.9.3
./bootstrap mongodb # 安装 MongoDB （默认是 64 位版本）
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>iwinux</author>
      <pubDate>Sat, 24 Dec 2011 16:31:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/584</link>
      <guid>https://ruby-china.org/topics/584</guid>
    </item>
    <item>
      <title>盛大云终于有 Ubuntu 10.04 镜像了</title>
      <description>&lt;p&gt;前两天配置公司的服务器时还只有 8.04（当时还企图强行升级到 10.04，失败了——后来查资料才明白 Xen 主机是不能这样升级的 =。=）&lt;/p&gt;

&lt;p&gt;现在终于有 10.04 可以用了……可惜我还没写好服务器的自动配置脚本，所以还要手动重新配置一次……  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Tue, 20 Dec 2011 18:00:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/537</link>
      <guid>https://ruby-china.org/topics/537</guid>
    </item>
    <item>
      <title>Asset Pipeline 在开发模式里引起的诡异 AJAX 问题</title>
      <description>&lt;p&gt;Rails 的 asset pipeline 在开发模式里会有一点诡异的行为。&lt;/p&gt;

&lt;p&gt;如果 config.assets.debug = true 而 application.js 里引用了 jquery_ujs，那么 AJAX 提交时就会出现重复提交的现象，原因是 jquery_ujs.js 被载入了两次——一次是单独载入，一次是在 application.js 里载入。解法是把 config.assets.debug 设为 false。&lt;/p&gt;

&lt;p&gt;如果需要调试 assets 的话，可以在页面 URL 里加入 ?debug_assets=true，效果等同于 config.assets.debug = true.  &lt;/p&gt;</description>
      <author>iwinux</author>
      <pubDate>Sat, 03 Dec 2011 16:01:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/330</link>
      <guid>https://ruby-china.org/topics/330</guid>
    </item>
    <item>
      <title>给 Mongoid 加上 find_by_xxx 方法</title>
      <description>&lt;p&gt;刚开始用 Mongoid 的时候就发现它不支持 ActiveRecord 里的 find_by_xxx 方法，忍了好久，终于忍无可忍，在 Github 找到一段代码，稍微改写了一下，把这个问题解决了。把这个文件存进 config/initializers/ 里就可以用了。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/1381824" rel="nofollow" target="_blank"&gt;https://gist.github.com/1381824&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Mongoid&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Finders&lt;/span&gt;
    &lt;span class="c1"&gt;# add find_by_xxx to Mongoid&lt;/span&gt;
    &lt;span class="c1"&gt;# from https://github.com/mitijain123/mongoid/commit/b28b360b787ba4cd32e5423afcfa3b83574f9df1&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;conditions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
      &lt;span class="n"&gt;bang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;

      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;method_id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
      &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/^find_(all|last||first)_?by_([_a-zA-Z]\w*)(!?)$/&lt;/span&gt;
        &lt;span class="n"&gt;finder_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vg"&gt;$1&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;:first&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="vg"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sym&lt;/span&gt;
        &lt;span class="n"&gt;bang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vg"&gt;$3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'!'&lt;/span&gt;

        &lt;span class="vg"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/_and_/&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each_with_index&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kp"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
          &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kp"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finder_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:conditions&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;conditions&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;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nil?&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;bang&lt;/span&gt;
          &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Errors&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DocumentNotFound&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="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="kp"&gt;nil&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="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>iwinux</author>
      <pubDate>Mon, 21 Nov 2011 14:32:50 +0800</pubDate>
      <link>https://ruby-china.org/topics/104</link>
      <guid>https://ruby-china.org/topics/104</guid>
    </item>
  </channel>
</rss>
