<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>piginzoo (动物园的猪)</title>
    <link>https://ruby-china.org/piginzoo</link>
    <description>动物园里闲庭信步</description>
    <language>en-us</language>
    <item>
      <title>git 忽略，忽略不了，搞不定了，谁来帮忙看看～</title>
      <description>&lt;p&gt;要忽略文件，放到.gitignore 里面，这个我是知道的，只可惜我做晚了，我已经把 data/config.php 文件放到 master 里面了，又 push 到 origin/master里面了，然后悲剧就此开始了。&lt;/p&gt;

&lt;p&gt;stackoverflow 上的帖子说：
&lt;a href="http://stackoverflow.com/questions/1139762/gitignore-file-not-ignoring" rel="nofollow" target="_blank"&gt;http://stackoverflow.com/questions/1139762/gitignore-file-not-ignoring&lt;/a&gt; 
“
If you are trying to ignore changes to a file that's already tracked in the repository (e.g. a dev.properties file that you would need to change for your local environment but you would never want to check in these changes) than what you want to do is:&lt;/p&gt;

&lt;p&gt;git update-index --assume-unchanged 
”&lt;/p&gt;

&lt;p&gt;可是，我这样做了，再 commit 到本地 master 上，也很赞，说文件 data/config.php 没有变，
可我要去 push 到 origin/master 上的时候，我一 pull，悲剧出现了，说我这个 data/config.php 需要 merge！！！&lt;/p&gt;

&lt;p&gt;我怎么才能彻底地让所有人（本地，远程）都彻底忽略这个文件呢？&lt;/p&gt;

&lt;p&gt;有谁有这种困扰，快来指点一下把～&lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Mon, 07 Apr 2014 12:23:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/18450</link>
      <guid>https://ruby-china.org/topics/18450</guid>
    </item>
    <item>
      <title>悲催一下午的验证码噩梦</title>
      <description>&lt;p&gt;周五了，欢天喜地地准备部署一把，周末去 High 了。在内网的模拟生产环境的服务器 capstrano 一把，过了，于是，淡定地敲出线上的 cap 命令，回车后，就尿尿去了。&lt;/p&gt;

&lt;p&gt;回来后，挂了，倒也没有惊慌，看看呗：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;** [out :: paozhoumo.com] Bundler could not find compatible versions for gem "bundler":
** [out :: paozhoumo.com] In Gemfile:
** [out :: paozhoumo.com] easy_captcha (&amp;gt;= 0) ruby depends on
** [out :: paozhoumo.com] bundler (&amp;gt;= 1.1.0) ruby &amp;lt;========================
** [out :: paozhoumo.com] 
** [out :: paozhoumo.com] Current Bundler version:
** [out :: paozhoumo.com] bundler (1.0.22)&amp;lt;===========================
** [out :: paozhoumo.com] 
** [out :: paozhoumo.com] This Gemfile requires a different version of Bundler.
** [out :: paozhoumo.com] Perhaps you need to update Bundler by running `gem install bundler`? 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;“easy_captcha”！是验证码的问题，这个是&lt;a href="/jungledrum" class="user-mention" title="@jungledrum"&gt;&lt;i&gt;@&lt;/i&gt;jungledrum&lt;/a&gt;找的 Gem，挺好用的，于是问了&lt;a href="/jungledrum" class="user-mention" title="@jungledrum"&gt;&lt;i&gt;@&lt;/i&gt;jungledrum&lt;/a&gt;鼓鼓，鼓鼓说，这个 Gem 有点问题，对 bundler 的依赖必须是~&amp;gt;1.0.0，于是他 fork 了一份，改成了 1.1.x，挺赞啊，我想，可是为什么服务器上 bundler 是 1.0.22 呢，于是查查，发现我们这台 2 月份搞来的盛大云主机，是 centos5.4 的，当时安装的 rails 环境的 bundler 就是 1.0.22。好嘞！原因找到，就解决呗。淡定的我，还丝毫意识不到，噩梦才刚刚开始。&lt;/p&gt;

&lt;p&gt;先搞搞 gem 吧，解决 bundler 版本问题，gem install bundler，好啦，升级了 bundler，继续 cap。几分钟的煎熬后，新问题又出来了，发现 easy_captcha 需要依赖于 rmagick, rmagick gem 安装又失败泪:~(&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Installing rmagick (2.13.1) with native extensions 
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby extconf.rb 

checking for Ruby version &amp;gt;= 1.8.5... yes
checking for gcc... yes
checking for Magick-config... yes
**checking for ImageMagick version &amp;gt;= 6.4.9... no&amp;lt;======================
Can't install RMagick 2.13.1. You must have ImageMagick 6.4.9 or later.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;什么！需要 ImageMagick 的版本大于 6.4.9，我勒个去！赶紧 check 了一下服务器上的 ImageMagick, yum 支持的是"6.2.8.0"，啊，顿时就慌乱了，肿么办？肿么办？
easy_captcha0.5.0---&amp;gt;rmagic 2.13.1----&amp;gt;ImageMagick6.5.9, 我靠，我的 CentOS5.4 推荐的兼容版本是 6.2.8 啊？！&lt;/p&gt;

&lt;p&gt;来吧，自己搞个版本吧，我下定决心，去下来 ImageMagick 的 source，make install 了一把，嘿，ImageMagick 现在 6.7.9 了，安装完毕后，洋洋得意地我，准备继续 bundle install 一把，果然，版本校验过了，可是新问题又出来了，编译 RMagick 的时候，居然说找不到 Magick 的头文件：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/bin/ruby1.8 extconf.rb
checking for Ruby version &amp;gt;= 1.8.5... yes
checking for gcc... yes
checking for Magick-config... yes
checking for ImageMagick version &amp;gt;= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no&amp;lt;============================

Can't install RMagick 2.13.1. Can't find MagickWand.h.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;噢的神哪，怎么又找不到头文件了呢？于是，我 ln 了所以可能需要的 header 文件和目录，靠，都是错误依旧。绝望了，绝望之余，去拜股沟大神，终于找到了救命贴：
&lt;a href="http://superuser.com/questions/163818/how-to-install-rmagick-on-ubuntu-10-04" rel="nofollow" target="_blank"&gt;http://superuser.com/questions/163818/how-to-install-rmagick-on-ubuntu-10-04&lt;/a&gt;
于是，噼里啪啦地一通乱敲后，居然搞定了：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/sbin/ldconfig /usr/local
ln -f /usr/local/bin/Magick-config /usr/bin/Magick-config
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ gem install rmagick
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，这条生死链终于打通了：easy_captcha0.5.0---&amp;gt;rmagic 2.13.1----&amp;gt;ImageMagick6.5.9。回味之余，参考帖子：&lt;a href="http://ruby-china.org/topics/772@user3%E7%9A%84github" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/772@user3的github&lt;/a&gt;，又去掉了了 fork，改用了原作者的 source link：:git =&amp;gt; '&lt;a href="https://github.com/phatworx/easy_captcha.git" rel="nofollow" target="_blank"&gt;https://github.com/phatworx/easy_captcha.git&lt;/a&gt;'，至此，完美解决。&lt;/p&gt;

&lt;p&gt;另，中途遇到一些 so 的链接和加载问题，如“libMagickCore.so.5: cannot open shared object file”参考帖子&lt;a href="http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&amp;amp;t=17059" rel="nofollow" target="_blank"&gt;http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&amp;amp;t=17059&lt;/a&gt; 都一一解决。&lt;/p&gt;

&lt;p&gt;注：关于 ldconfig: &lt;a href="http://www.xxlinux.com/linux/article/accidence/technique/20081230/14754.html" rel="nofollow" target="_blank"&gt;http://www.xxlinux.com/linux/article/accidence/technique/20081230/14754.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;总结一下吧：&lt;/p&gt;

&lt;p&gt;因缘，因是悲催的 CentOS5.4，老点，引起版本的问题。
感叹：部署是个恼人的事，版本的依赖管理是个噩梦。&lt;/p&gt;

&lt;p&gt;特发此帖，以对逝去的一下午时间的深深惋惜，也为自己留个笔记，也为遇到类似问题的 XDJM 们留个可以参考的文字。 &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Sun, 02 Sep 2012 21:02:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/5321</link>
      <guid>https://ruby-china.org/topics/5321</guid>
    </item>
    <item>
      <title>问个问题，怎么解决手机端程序生成主键冲突问题</title>
      <description>&lt;p&gt;万能的坛，问个纠结的问题。&lt;/p&gt;

&lt;p&gt;我们在做一个手机端+rails 服务器的应用。&lt;/p&gt;

&lt;p&gt;手机端用户创建的记录，需要主键值，如果用自增，将来传到服务器上，肯定会跟别的用户冲突。如果再加上外键关系，就乱上加乱。&lt;/p&gt;

&lt;p&gt;我们考虑用 UUID，让各个用户的 id 不再一样，但是，UUID 是 char(36), 如果是 mysql 做主键会有性能问题，我们正在纠结这事，你们怎么解决的丫？&lt;/p&gt;

&lt;p&gt;UUID 的问题：
&lt;a href="http://hi.baidu.com/thinkinginlamp/blog/item/c609d10979710e81d0581b60.html" rel="nofollow" target="_blank"&gt;http://hi.baidu.com/thinkinginlamp/blog/item/c609d10979710e81d0581b60.html&lt;/a&gt;
&lt;code&gt;
对于InnoDB这种聚集主键类型的引擎来说，数据会按照主键进行排序，由于UUID的无序性，InnoDB会产生巨大的IO压力，此时不适合使用UUID做物理主键，可以把它作为逻辑主键，物理主键依然使用自增ID。
&lt;/code&gt;  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Fri, 22 Jun 2012 10:16:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/3937</link>
      <guid>https://ruby-china.org/topics/3937</guid>
    </item>
    <item>
      <title>有人常上喷嚏网么？</title>
      <description>&lt;p&gt;不是广告，真的很喜欢打喷嚏。  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Wed, 04 Apr 2012 10:52:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/2371</link>
      <guid>https://ruby-china.org/topics/2371</guid>
    </item>
    <item>
      <title>关于部署的时候的 public 目录是否可以做成一个 link 目录？</title>
      <description>&lt;p&gt;我们开启了页面的 cache，这样，动态访问后，只要不变化就会缓冲到 public 目录下。&lt;/p&gt;

&lt;p&gt;但是一旦重新部署，public 目录就被会被新的 release 替代，那些 cache 的页面 html 都没了，只能再重新生成了。我想了个办法，就是把 public 目录做成一个软链接目录，每次新的 release 从 git 拉下来后，就把 public 里面的东西拷贝到一个 share 目录中，然后删除掉 release 目录中的 public 目录，最后把 share 目录软链接到 release 的 public 目录中。&lt;/p&gt;

&lt;p&gt;简而言之，就是 public 目录是一个软链接目录，这样 cache 就可以永远在一个固定目录中了。&lt;/p&gt;

&lt;p&gt;但是，我这样做了后，访问站点的时候，总是报错：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2012/03/21 21:27:45 [error] 8496#0: *1 directory index of "/data/www/current/public/" is forbidden, client: 192.168.0.171, server: localhost, request: "GET / HTTP/1.1", host: "192.168.0.106"

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是我去访问静态页面是存在的 &lt;a href="http://192.168.0.106/test.htmlnginx%E6%B2%A1%E6%9C%89%E6%89%BE%E5%88%B0ruby%E7%9A%84%E7%8E%AF%E5%A2%83%EF%BC%8C%E4%BD%86%E6%98%AF%E6%88%91ps%E5%8F%91%E7%8E%B0passenger%E8%BF%9B%E7%A8%8B%E9%83%BD%E6%98%AF%E5%A5%BD%E5%A5%BD%E7%9A%84%E3%80%82" rel="nofollow" target="_blank"&gt;http://192.168.0.106/test.htmlnginx没有找到ruby的环境，但是我ps发现passenger进程都是好好的。&lt;/a&gt;，感觉是，&lt;/p&gt;

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

&lt;p&gt;1.难道 passenger 就不能把 nginx 的 root 配置成软链接目录么？何种原因导致无法启动 ruby 呢？&lt;/p&gt;

&lt;p&gt;2.大家有好的办法，能让我保留我的那些缓冲么？你知道的，重新部署后，那些缓冲的千千万万的页面要是拷贝过来是多费资源的事啊。你们是怎么解决这个问题的呢？rubychina 也应该会遇到这个问题吧？如何解决的呢？问一下&lt;a href="/rei" class="user-mention" title="@rei"&gt;&lt;i&gt;@&lt;/i&gt;rei&lt;/a&gt;和&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;。  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Wed, 21 Mar 2012 13:41:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/2024</link>
      <guid>https://ruby-china.org/topics/2024</guid>
    </item>
    <item>
      <title>Capstrano 经验分享</title>
      <description>&lt;p&gt;最近鼓捣 capstrano 并被之折磨，终于有了一些心得，不敢独享，share 给大家。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.我们的的 capstrona 配置&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# encoding: utf-8&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'bundler/capistrano'&lt;/span&gt;                &lt;span class="c1"&gt;#添加之后部署时会调用bundle install， 如果不需要就可以注释掉&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:keep_releases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;                    &lt;span class="c1"&gt;#只保留10个备份&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"myapp"&lt;/span&gt;     &lt;span class="c1"&gt;#应用名称&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s2"&gt;"git@myapp.com:/data/gitrepo/myapp"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:deploy_to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s2"&gt;"/data/www"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:current_public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s2"&gt;"/data/www/current/public"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:shared_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="s2"&gt;"/data/www/shared"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"deploy"&lt;/span&gt;                       &lt;span class="c1"&gt;#登录部署机器(myapp.com)的用户名&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"123456"&lt;/span&gt;                   &lt;span class="c1"&gt;#登录部署机器的密码， 如果不设部署时需要输入密码&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:use_sudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;                      &lt;span class="c1"&gt;#执行的命令中含有sudo， 如果设为false， 用户所有操作都有权限&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:scm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:git&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:bundle_flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'--quiet'&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:copy_exclude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="ss"&gt;:group_writable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;role&lt;/span&gt;  &lt;span class="ss"&gt;:web&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"192.168.0.106"&lt;/span&gt;                     &lt;span class="c1"&gt;#Your HTTP server, Apache/etc&lt;/span&gt;
&lt;span class="n"&gt;role&lt;/span&gt;  &lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"192.168.0.106"&lt;/span&gt;                     &lt;span class="c1"&gt;#This may be the same as your `Web` server&lt;/span&gt;
&lt;span class="n"&gt;role&lt;/span&gt;  &lt;span class="ss"&gt;:db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s2"&gt;"192.168.0.106"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:primary&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="c1"&gt;#This is where Rails migrations will run&lt;/span&gt;
&lt;span class="n"&gt;default_run_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:pty&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;            &lt;span class="c1"&gt;#pty: 伪登录设备&lt;/span&gt;
&lt;span class="c1"&gt;#after， before 表示在特定操作之后或之前执行其他任务&lt;/span&gt;
&lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="s2"&gt;"deploy:update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"deploy:migrate"&lt;/span&gt;
&lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="s2"&gt;"deploy:migrate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"deploy:symbol_resource"&lt;/span&gt;
&lt;span class="c1"&gt;# If you are using Passenger mod_rails uncomment this:&lt;/span&gt;
&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:deploy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"restart the paozhoumo application"&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:restart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:roles&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:except&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;:no_release&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="k"&gt;do&lt;/span&gt;
   &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;try_sudo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; touch &lt;/span&gt;&lt;span class="si"&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'tmp'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'restart.txt'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
   &lt;span class="c1"&gt;# rails 3.1首次访问时间较长，发布成功后先访问一下，进行初始化&lt;/span&gt;
   &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"curl -s -o /dev/null 127.0.0.1"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="c1"&gt;#用新的拉下来的public里面的内容替换旧的shared目录的，然后删除掉public，用shared链接到public&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"copy everyting to overwrite the shared public folder"&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:symbol_resource&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;#拷贝新拉下来的images/css/jslib,以及目录下的文件&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"rm -rf &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/images/*"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"cp -r &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_public&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/images/* &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/images/"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"rm -rf &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/css/*"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"cp -r &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_public&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/css/* &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/css/"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"rm -rf &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/jslib/*"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"cp -r &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_public&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/jslib/* &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/jslib/"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"rm -f &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/*.*"&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"cp &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_public&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;shared_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;#然后把拉下来的public目录删除掉&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"rm -rf &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_public&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;#把共享的share文件夹中&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"ln -sf &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;shared_path&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;current_public&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&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;&lt;strong&gt;2.几点说明：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这里有两个帐号，一个是“git@myapp.com:/data/gitrepo/myapp”，也就是 git 服务器上的 git 帐号，还有一个是要部署到某台机器上的时候登录用的帐号：deploy。因此，如果你做本地的 ssh 的密码配置，在 cap deploy 过程中，需要输入 git 用户的密码，和 deploy 用户的密码。&lt;/p&gt;

&lt;p&gt;这里有 3 台机器将卷入这个部署&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;你的开发机&lt;/li&gt;
&lt;li&gt;你的 git 服务器（放着 team 的 merge 后的代码滴最新版）&lt;/li&gt;
&lt;li&gt;你要去部署的服务器&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;过程就是你在你的开发机器上运行 cap deploy，然后远程登录到被部署的机器上跑 cap 的脚本，期间会自动到 git 服务器上拉代码，过程大抵如此。&lt;/p&gt;

&lt;p&gt;后面我 trace 了一个整个过程的 shell 脚本，并加上注释，可以细看。&lt;/p&gt;

&lt;p&gt;在第一次运行 cap deploy:setup 的时候，会报权限错误，毕竟 deploy 用户权限很低，不能随便创建目录，那么就用 root 或者其他有权限的帐号，先建好 my app 的根目录，然后 chown deploy:deploy_group /my_app_root 即可。&lt;/p&gt;

&lt;p&gt;由于脚本中有了这行 require 'bundler/capistrano' ，cap 会在部署的时候，重新拉一份 gem 下来，放到 shared/bunld目录下，即使你生产机器上已经有 gem 了，小哥们还是会不知疲倦地下载一份，原因是，这个脚本触发了这条命令：bundle install --gemfile /data/www/releases/20120321020234/Gemfile --path /data/www/shared/bundle --quiet --without development test.我曾经担心过 rails 启动的时候，是去找这里面的 gem 还是去找系统目录下的 gem 呢，后来得知在 Myapp 目录下会生成一个 .bundld/config，告诉rails用哪个gem目录，就释然了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. cap 运行过程中的脚本：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#列出remote上最新的head&lt;/span&gt;
git ls-remote deploy@paozhoumo.com:/data/gitrepo/paozhoumo HEAD
&lt;span class="c"&gt;#做一些目录清场和准备&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /data/www/releases/20120321020234/public/assets 
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /data/www/releases/20120321020234/public        
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /data/www/shared/assets
&lt;span class="c"&gt;#做1个软连接，后面还有3个&lt;/span&gt;
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /data/www/shared/assets /data/www/releases/20120321020234/public/assets
&lt;span class="c"&gt;#改变目录为组可写&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; g+w /data/www/releases/20120321020234
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /data/www/releases/20120321020234/log /data/www/releases/20120321020234/public/system /data/www/releases/20120321020234/tmp/pids 
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /data/www/releases/20120321020234/public
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /data/www/releases/20120321020234/tmp
&lt;span class="c"&gt;#做了3个软连接&lt;/span&gt;
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /data/www/shared/log /data/www/releases/20120321020234/log
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /data/www/shared/system /data/www/releases/20120321020234/public/system
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /data/www/shared/pids /data/www/releases/20120321020234/tmp/pids
&lt;span class="c"&gt;#重新touch一下这些目录中的所有的文件&lt;/span&gt;
find /data/www/releases/20120321020234/public/images /data/www/releases/20120321020234/public/stylesheets /data/www/releases/20120321020234/public/javascripts &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;touch&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 201203210202.50 &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="s1"&gt;';'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;#列出文件来，-x是在一行的意思，不知道要干嘛？&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; /data/www/releases
&lt;span class="nb"&gt;cd&lt;/span&gt; /data/www/releases/20120321020234
&lt;span class="c"&gt;#安装bundle到/shared/bundle里面，但是用的Gemfile是新拉下来的gemfile&lt;/span&gt;
bundle &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--gemfile&lt;/span&gt; /data/www/releases/20120321020234/Gemfile &lt;span class="nt"&gt;--path&lt;/span&gt; /data/www/shared/bundle &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--without&lt;/span&gt; development &lt;span class="nb"&gt;test
cd&lt;/span&gt; /data/www/releases/20120321030939
&lt;span class="c"&gt;#做资源预编译，地球人都知道&lt;/span&gt;
bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rake &lt;span class="nv"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="nv"&gt;RAILS_GROUPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;assets assets:precompile
&lt;span class="c"&gt;#改链接之类的后续活&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /data/www/current &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /data/www/releases/20120321030939 /data/www/current
&lt;span class="nb"&gt;cd&lt;/span&gt; /data/www/releases/20120321030939
&lt;span class="c"&gt;#执行migration&lt;/span&gt;
bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rake &lt;span class="nv"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production  db:migrate
。。。。
&lt;span class="c"&gt;# 后面就没啥了&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4.参考：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;官方给的流程图：
&lt;img src="https://github.com/mpasternacki/capistrano-documentation-support-files/raw/master/default-execution-path/Capistrano%20Execution%20Path.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.csdn.net/largetalk/article/details/6743090" rel="nofollow" target="_blank"&gt;http://blog.csdn.net/largetalk/article/details/6743090&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/133-capistrano-tasks" rel="nofollow" target="_blank"&gt;http://railscasts.com/episodes/133-capistrano-tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/capistrano/capistrano/wiki/2.x-Significant-Configuration-Variables" rel="nofollow" target="_blank"&gt;https://github.com/capistrano/capistrano/wiki/2.x-Significant-Configuration-Variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kris.me.uk/2010/08/30/rails3-hosting-all-in-one.html" rel="nofollow" target="_blank"&gt;http://kris.me.uk/2010/08/30/rails3-hosting-all-in-one.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://seamon.iteye.com/blog/1166012" rel="nofollow" target="_blank"&gt;http://seamon.iteye.com/blog/1166012&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>piginzoo</author>
      <pubDate>Wed, 21 Mar 2012 11:37:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/2020</link>
      <guid>https://ruby-china.org/topics/2020</guid>
    </item>
    <item>
      <title>关于 RESTful 资源的 helper 的方法？</title>
      <description>&lt;p&gt;地球人都知道，rails 帮咱们生成了一堆的 resources 的方法，猪如 new_xxx_path，edit_xxx_path，可是这写个类，是怎么生成的？是哪个 module 生成的？我试图去找找源码看看，可是，找不到啊。哪位了解内幕，源源一声，给个线索。  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Thu, 08 Mar 2012 16:48:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/1710</link>
      <guid>https://ruby-china.org/topics/1710</guid>
    </item>
    <item>
      <title>Capistrano 部署用非 root 用户时的权限问题，求解！</title>
      <description>&lt;p&gt;为了安全，我肯定不能把 root 和密码写在 deploy.rb 中，这样就得每次运行 cap deploy 的时候输入 root 密码，麻烦。于是创建了个 deploy 用户，设置个不太怕泄露的密码，写在 deploy.rb 中，然后用 deploy ssh 到服务器上去跑 cap deploy。&lt;/p&gt;

&lt;p&gt;怕权限问题，就把 git 的库目录的归属组设置成一个叫 gitgroup 组，然后把 deploy 用户，以及提交代码用的 git 用户都的主组都设成了 gitgroup。心满意足后，用 deploy ssh 后，跑 cap deply，依然苦逼地报 Operation not permitted。开 debug 跑 cap deply -d，发现原因是：&lt;/p&gt;

&lt;p&gt;git clone 后，生成的文件的组权限是 r--，然后 cap 试图运行&lt;code&gt;chmod -R g+w xxxx&lt;/code&gt;的时候，报错&lt;code&gt;chmod: changing permissions of ........: Operation not permitted&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;我现在能想到的办法就是改 deploy 用户的 umask，让 cap 运行 git clone 复制过来的时候，就加上组权限为写。&lt;/p&gt;

&lt;p&gt;你们遇到这种问题过么？或者，你们是如何使用 non-root 用户来构建发布环境的，说说大家的最佳实践吧。  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Thu, 08 Mar 2012 12:19:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/1696</link>
      <guid>https://ruby-china.org/topics/1696</guid>
    </item>
    <item>
      <title>吐槽一下 widget</title>
      <description>&lt;p&gt;作为一个 rails 新手，我一直想了解 rails 有没有一个组件化设计的方案，我自己写了一个图片增删改查浏览的模块，我管他叫模块，是因为我把能和图片处理相关的东西尽可能地放到了一起，我是怎么做的呢？&lt;/p&gt;

&lt;p&gt;1.首先我做图片的 nest 方式&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resources :A do
  resources :images
end
resources :B do
  resources :images
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还要使用多态，让图片可以跟多个 model 关联&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Image &amp;lt; ActiveRecord::Base
  belongs_to :a, :polymorphic =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.我把图片的浏览的类似于幻灯片，需要嵌入到 A 或 B 的页面中的，剥离成 partail&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;%= render "images/pictures", :pictures=&amp;gt;@a.images%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.我还要考虑图片的维护中的边边角角上的链接，比如 new_image 路径啥的，但因为这个 image 被多个人嵌套，所以，就得动态决定是 new_a_image 还是 edit_b_image，因此我写了个个 helper 方法&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def new_the_image_path it
   return new_a_image_path if it.instance_of? A
   return new_b_image_path if it.instance_of? B
   nil
 end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终，可以复用了，但是总觉的不爽：
1.代码还是散落，有 model，有 view，controller
2.如果我要用 image，比如我是 A 或者 B，我还要在我的 controller 中准备好相关的数据&lt;/p&gt;

&lt;p&gt;后来就琢磨有没有更好的方案，想来 rails 大牛们一定写过这种东西吧，于是先搜到了 cells，发现只是用了 view 层显示用的，xdite 对 cell 烧香很推崇，不过，好像还达不到到复用的境界，后来顺藤摸瓜看到了 apotomo 的 widget，都是他们哥几个写的，于是吭哧吭哧看是看，拜了一下谷歌大神，中文资料奇少，于是就去他的官网上看&lt;a href="http://http://apotomo.de/" rel="nofollow" target="_blank"&gt;http://http://apotomo.de/&lt;/a&gt;, 然后看他的 screencasts，大概搞明白了，于是照葫芦画瓢地做了个 widget，这里吐槽一下：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;这东西挺好，有生成器，都生成在 widget 目录下，锦簇&lt;/li&gt;
&lt;li&gt;这东西严重依赖于 jquery 或其他 ajax 框架，要做 widget 页面内的跳转，就得靠 Jquery 的 replaceWith 了
3.有了 xdite 说的 mini-controller，可以在控制 widget 内部的页面需要的数据准备，或者是 widget 发送过来的数据的处理&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;总体感觉，这东西适合做类似于 comments,tags 等局部显示特性强，而且，需要局部刷显得“部件”，和我想象的纯粹业务层面的复用组件，比如我上面提的 image 处理，其实，用他做就不太好用，我还是保留我的那个做法了。总之，这东西挺好，用一用可以做出一些复用性比较强的小组件，但是，没办法大范围地采用到项目中，我的感觉，吐槽完毕。&lt;/p&gt;

&lt;p&gt;widget 的文章：
&lt;a href="http://apotomo.de/" rel="nofollow" target="_blank"&gt;http://apotomo.de/&lt;/a&gt;
没了&lt;/p&gt;

&lt;p&gt;关于 cells 的文章：
&lt;a href="http://kpumuk.info/ruby-on-rails/simplifying-your-ruby-on-rails-code/" rel="nofollow" target="_blank"&gt;http://kpumuk.info/ruby-on-rails/simplifying-your-ruby-on-rails-code/&lt;/a&gt;
&lt;a href="http://blog.xdite.net/posts/2011/12/04/misunderstanding-about-render/" rel="nofollow" target="_blank"&gt;http://blog.xdite.net/posts/2011/12/04/misunderstanding-about-render/&lt;/a&gt; &amp;lt;----绝对好文
&lt;a href="http://rdoc.info/github/apotonick/cells/master/file/README.rdoc" rel="nofollow" target="_blank"&gt;http://rdoc.info/github/apotonick/cells/master/file/README.rdoc&lt;/a&gt;
&lt;a href="http://mikepence.wordpress.com/2008/03/16/cells-bring-clean-re-use-to-your-rails-views/" rel="nofollow" target="_blank"&gt;http://mikepence.wordpress.com/2008/03/16/cells-bring-clean-re-use-to-your-rails-views/&lt;/a&gt;
&lt;a href="http://ruby-china.org/topics/135" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/135&lt;/a&gt;
&lt;a href="http://nicksda.apotomo.de/2010/11/lets-write-a-reusable-sidebar-component-in-rails-3/" rel="nofollow" target="_blank"&gt;http://nicksda.apotomo.de/2010/11/lets-write-a-reusable-sidebar-component-in-rails-3/&lt;/a&gt;
&lt;a href="http://lostechies.com/derickbailey/2011/04/11/cells-partial-controllers-and-views-for-rails-3/" rel="nofollow" target="_blank"&gt;http://lostechies.com/derickbailey/2011/04/11/cells-partial-controllers-and-views-for-rails-3/&lt;/a&gt;&lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Thu, 01 Mar 2012 17:59:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/1538</link>
      <guid>https://ruby-china.org/topics/1538</guid>
    </item>
    <item>
      <title>第三方引入 js 后 production 下报未编译的错误</title>
      <description>&lt;p&gt;生产部署中遇到一个问题，希望高手帮忙看看？&lt;/p&gt;

&lt;p&gt;我在某个单独页面内引入了一个第三方的 js，我没有把它 include 到 application.js 中，因为我觉得只有这一个页面用，不能放到 application.js 中。&lt;/p&gt;

&lt;p&gt;于是乎，我就在这个单独页面中加入了这行：
&lt;code&gt;&amp;lt;%= javascript_include_tag "jquery.fancybox-1.3.4" %&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;开发环境一切 ok，到了生产部署的时候，就报错啦：
&lt;code&gt;ActionView::Template::Error (jquery.fancybox-1.3.4 isn't precompiled):
    1: &amp;lt;%= javascript_include_tag "jquery.fancybox-1.3.4" %&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;当然先问 google 大神+stackoverflow 大神，巴拉巴拉，得到了一堆的指导，屁如：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在 production.rb 中加入预编译文件列表
#加入我们自己额外用哦 js 的预编译
&lt;code&gt;config.assets.precompile += %w( jquery.fancybox-1.3.4.js )&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.去人肉到生产环境下检查 cap deploy 是否生成了编译后的 js，果然，也找到了&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ll public/assets/jquery.fancybox-1.3.4*
public/assets/jquery.fancybox-1.3.4-9d272ff223e751fc8890a84ebfc51814.js
public/assets/jquery.fancybox-1.3.4-9d272ff223e751fc8890a84ebfc51814.js.gz
public/assets/jquery.fancybox-1.3.4.js
public/assets/jquery.fancybox-1.3.4.js.gz
# pwd
/data/www/current
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一切看上去挺好的啊，可是，前台一刷，就是还报“jquery.fancybox-1.3.4 isn't precompiled”，为何啊？！&lt;/p&gt;

&lt;p&gt;别跟我说，放到直接放到 public 里，也别跟我说设置 config.assets.compile = true，这些都是 workaround，我想知道我到底卡在了哪里。
另外，查了“isn't precompile”提示只出现在 rails_helper.rb 的 digest_for 方法中，看了看，大致是说我没有设置 compile_assets 属性之类的%……&amp;amp;×（，不知所云了。。。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;digest_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logical_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="err"&gt;。。。。&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;compile_assets&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;digest_assets&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asset_environment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;logical_path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest_path&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;logical_path&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;AssetNotPrecompiledError&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="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;logical_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; isn't precompiled"&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>piginzoo</author>
      <pubDate>Sat, 25 Feb 2012 11:24:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/1414</link>
      <guid>https://ruby-china.org/topics/1414</guid>
    </item>
    <item>
      <title>问一句，大家都在用什么 HTML 在线编辑器？</title>
      <description>&lt;p&gt;rails3.1 里引入的 asset pipelline，导致了 js、图片等资源，特别是 css 中的图片资源需要重新定义，这导致引入一个 js/css 框架的时候需要自己手工修改一大堆的东西，比如，把 css/image/js 放到各自目录中，并且修改 css 中的 img 为 sass 风格的 image-url。现在引入一个 js 项目，费劲啊。大家的感受呢？这也引出了我的问题，哪个 HTML 编辑器好？&lt;/p&gt;

&lt;p&gt;看了一圈 HTML 编辑器，ckeditor 是老牛了，国内的 kindeditor 也不错，不过我看 rails 社区好像多在用 tinyMCE，原因都是 asset pipeline 闹的。tinyMCE 的 gem 做的好，解决了 assetpipeline 的问题。ckeditor 的 gem 一直都没有好的，害得&lt;a href="/tsechingho" class="user-mention" title="@tsechingho"&gt;&lt;i&gt;@&lt;/i&gt;tsechingho&lt;/a&gt;还自己写了个 gem：&lt;a href="http://ruby-taiwan.org/topics/61" rel="nofollow" target="_blank"&gt;http://ruby-taiwan.org/topics/61&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;所以，问一句，大家都在用什么编辑器？  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Tue, 21 Feb 2012 00:57:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/1319</link>
      <guid>https://ruby-china.org/topics/1319</guid>
    </item>
    <item>
      <title>console 中测试路由规则的问题?</title>
      <description>&lt;p&gt;在 Rails 3.1 中，想在 &lt;code&gt;rails console&lt;/code&gt; 里测试一下路由规则，于是输入&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recognize_path&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果报 Rack 的错误，看了一下 rack 的代码，晕，
遇到过的兄弟帮忙看看啥原因？&lt;/p&gt;
&lt;pre class="highlight irb"&gt;&lt;code&gt;&lt;span class="gp"&gt;irb(main):002:0&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;
&lt;span class="gp"&gt;irb(main):002:0&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recognize_path&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;
&lt;span class="gr"&gt;RuntimeError: route set not finalized
        from C:/software/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:81:in `recognize'
        from C:/software/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.1.1/lib/action_dispatch/routing/route_set.rb:546:in `recognize_path'
        from (irb):2
        from C:/software/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
        from C:/software/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
        from C:/software/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/commands.rb:40:in `&amp;lt;top (required)&amp;gt;'
        from script/rails:6:in `require'
        from script/rails:6:in `&amp;lt;main&amp;gt;'
&lt;/span&gt;&lt;span class="gp"&gt;irb(main):003:0&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>piginzoo</author>
      <pubDate>Wed, 15 Feb 2012 18:35:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/1216</link>
      <guid>https://ruby-china.org/topics/1216</guid>
    </item>
    <item>
      <title>好奇删除的时候的确认对话框肿么出来滴？</title>
      <description>&lt;p&gt;&amp;lt;%= link_to '删除', &lt;a href="/mymodel" class="user-mention" title="@mymodel"&gt;&lt;i&gt;@&lt;/i&gt;mymodel&lt;/a&gt;, confirm: '是否删除？', method: :delete %&amp;gt;
生成的 HTML 如下
&lt;a href="/sub_resorts/1" rel="nofollow"&gt;Destroy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;可是，为何我一点击就会触发弹出一个确认对话框呢？好生好奇啊，谁来解释一下。  &lt;/p&gt;</description>
      <author>piginzoo</author>
      <pubDate>Mon, 13 Feb 2012 20:40:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/1182</link>
      <guid>https://ruby-china.org/topics/1182</guid>
    </item>
  </channel>
</rss>
